Imports System.Windows.Forms.Integration Imports System.Windows.Interop Imports System.IO Imports EgtUILib Imports EgtWPFLib5 Imports EgtWPFLib5.EgtFloating Namespace EgtCAM5 Public Class ProjectViewModel Inherits TabViewModel #Region "FIELDS" ' Variabili in cui salvo i filtri di selezione della modalità Draw e che poi ripristino all'uscita dalla modalità Machining Private m_bSelZeroDim As Boolean = True Private m_bSelCurve As Boolean = True Private m_bSelSurf As Boolean = True Private m_bSelVolume As Boolean = True Private m_bSelExtra As Boolean = True Private m_bLoaded As Boolean = False ' Variabile che contiene il Frame di disegno per poterlo ripristinare dopo essere passato dalla lavorazioneù Private m_GridDrawFrame3d As Frame3d = New Frame3d(New Point3d(0, 0, 0)) 'PROJECT PAGE'S SCENE FIELDS AND PROPERTIES ' Reference to the ProjectScene Private WithEvents m_ProjectScene As New Scene ' Reference to the ProjectSceneHost Private SceneHost As WindowsFormsHost ' Property used to bind the scene to the WindowsFormsHost in XAML Private m_bfirst As Boolean = True Public ReadOnly Property ProjectSceneHost As WindowsFormsHost Get If m_bfirst Then SceneHost = New WindowsFormsHost() With {.Child = m_ProjectScene} m_bfirst = False End If Return SceneHost End Get End Property ' Scene controller Private WithEvents m_Controller As New Controller ' Definizione comandi Private m_cmdLoaded As ICommand ' Flag per non salvare Script appena eseguito in elenco MruScript Private m_bScriptInMru As Boolean = True #End Region #Region "EGTUILIB FIELDS" Private m_bCPlaneTypePos As Boolean 'Private m_bStopExec As Boolean = False 'Private m_ProcEventsCallback As New ProcessEventsCallback(AddressOf ProcessEvents) 'Private m_OutTextCallback As New OutTextCallback(AddressOf OutText) ' Variabile per implementazione eventi Private m_InputText As String #End Region #Region "CONSTRUCTOR" Sub New() ' Creo riferimento a questa classe in EgtCAM5Map EgtCAM5Map.SetRefProjectVM(Me) ' Creo classe di supporto per la visualizzazione dei parametri utensile e di lavorazione per Db e operazioni SharedFieldsClass.bFirst = True ManageClosingApplication() RegisterMainWindowCommands() ' Inizializza i parametri della scena 'InitializeEgtProject() RegisterControllerCommands() ManageTopCommandBar() ' Funzione che contiene la registrazione di tutti i comandi del DrawOptionPanel RegisterDrawOptionPanelCommands() ' Funzione che contiene la registrazione di tutti i comandi della StatusBar RegisterStatusBarCommands() ' Cambio impostazioni griglia a seconda che sia in modalità Draw o Machining Application.Msn.Register(Application.MACHININGMODE_ISCHECKED, Sub() ' Salvo il Frame3d di disegno m_GridDrawFrame3d = EgtGetGridFrame() ' sposto la griglia sulla tavola di lavorazione Dim TableRef As Point3d EgtGetTableRef(1, TableRef) EgtSetGridFrame(New Frame3d(TableRef)) m_ProjectScene.GetObjFilterForSel(m_bSelZeroDim, m_bSelCurve, m_bSelSurf, m_bSelVolume, m_bSelExtra) Application.Msn.NotifyColleagues(Application.UPDATESTATUSGRID, New UpdateStatusGridParam(IniFile.m_bMachiningShowGrid, IniFile.m_bShowGridFrame)) End Sub) Application.Msn.Register(Application.DRAWMODE_ISCHECKED, Sub() ' Ripristino il riferimento della griglia di disegno EgtSetGridFrame(m_GridDrawFrame3d) m_ProjectScene.SetObjFilterForSel(m_bSelZeroDim, m_bSelCurve, m_bSelSurf, m_bSelVolume, m_bSelExtra) Application.Msn.NotifyColleagues(Application.UPDATESTATUSGRID, New UpdateStatusGridParam(IniFile.m_bDrawShowGrid, IniFile.m_bShowGridFrame)) End Sub) Application.Msn.Register(Application.SETSCENESELMODE, Sub(nSceneSelMode As SceneSelModeOpt) Me.SceneSelMode = nSceneSelMode End Sub) Application.Msn.Register(Application.SETSCENESELTYPE, Sub(nSceneSelType As SceneSelTypeOpt) Me.SceneSelType = nSceneSelType End Sub) Application.Msn.Register(Application.SETMOVEINDISPOSITION, Sub(bMoveInDisposition As Boolean) Me.bMoveInDisposition = bMoveInDisposition End Sub) End Sub #End Region #Region "Get & Set" Friend Function GetScene() As Scene Return m_ProjectScene End Function Friend Function GetController() As Controller Return m_Controller End Function #End Region ' Get & Set #Region "COMMANDS" #Region "LoadedCommand" ''' ''' Returns a command that do Point. ''' Public ReadOnly Property LoadedCommand As ICommand Get If m_cmdLoaded Is Nothing Then m_cmdLoaded = New RelayCommand(AddressOf Loaded) End If Return m_cmdLoaded End Get End Property ''' ''' Execute the Point. This method is invoked by the PointCommand. ''' Public Sub Loaded(ByVal param As Object) If m_bLoaded Then Return m_bLoaded = True ' Creazione scena PreInitializeScene() If Not m_ProjectScene.Init() Then EgtOutLog("Error in Project scene creation") SceneHost.Child = Nothing ' Box di avviso chiave mancante MsgBox(EgtMsg(MSG_MISSINGKEYWD + 2) & vbCrLf & EgtMsg(MSG_MISSINGKEYWD + 3), MsgBoxStyle.OkOnly, EgtMsg(MSG_MISSINGKEYWD + 1)) ' Chiudo il programma IniFile.m_bFailedRun = True Application.Msn.NotifyColleagues(Application.CLOSEAPPLICATIONCOMMAND) ' Verifico abilitazione prodotto ElseIf (IniFile.m_nKeyOptions And KEY_OPT.BASE) = 0 Then MsgBox(EgtMsg(MSG_MISSINGKEYWD + 5), MsgBoxStyle.OkOnly, EgtMsg(MSG_MISSINGKEYWD + 1)) ' Chiudo il programma IniFile.m_bFailedRun = True Application.Msn.NotifyColleagues(Application.CLOSEAPPLICATIONCOMMAND) Else IniFile.m_ProjectSceneContext = m_ProjectScene.GetCtx PostInitializeScene() ' Recupero e imposto handle finestra principale Dim hMainWnd As IntPtr = New WindowInteropHelper(Application.Current.MainWindow).Handle EgtSetMainWindowHandle(hMainWnd) ' inizializzo gestore lavorazioni EgtInitMachMgr(IniFile.m_sMachinesRoot) ' Apro progetto vuoto EgtCAM5Map.refTopCommandBarVM.NewCmd() End If ' Seleziono la macchina impostata nel file ini Application.Msn.NotifyColleagues(Application.LOADCURRENTMACHINE) EgtSetCurrentContext(IniFile.m_ProjectSceneContext) End Sub #End Region ' LoadedCommand #End Region #Region "METHODS" 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 sCmdLogFile As String = CMDLOG_FILE_NAME.Replace("#", IniFile.m_nInstance.ToString()) If Not m_Controller.SetCommandLog(bLuaReg, m_sTempDir, sCmdLogFile) Then EgtOutLog("Command log not started") If Environment.GetCommandLineArgs.Count() <= 1 Then MessageBox.Show("Command log not started", "TestEIn Warning", MessageBoxButton.OK, MessageBoxImage.Warning) End If End If ' imposto unità di misura per interfaccia utente IniFile.m_bMmUnits = (GetPrivateProfileInt(S_SCENE, K_MMUNITS, 1) <> 0) Application.Msn.NotifyColleagues(Application.UPDATESTATUSUNITS, IniFile.m_bMmUnits) ' imposto visualizzazione riferimento globale Dim bShowGlobFrame As Boolean = (GetPrivateProfileInt(S_SCENE, K_SHOWGFRAME, 1) <> 0) EgtSetGlobFrameShow(bShowGlobFrame) ' imposto i dati della griglia LoadGridData() ' imposto stato di visualizzazione della griglia IniFile.m_bDrawShowGrid = (GetPrivateProfileInt(S_GRID, K_DRAWSHOWGRID, 1) <> 0) IniFile.m_bMachiningShowGrid = (GetPrivateProfileInt(S_GRID, K_MACHININGSHOWGRID, 1) <> 0) IniFile.m_bShowGridFrame = (GetPrivateProfileInt(S_GRID, K_SHOWFRAME, 1) <> 0) Application.Msn.NotifyColleagues(Application.UPDATESTATUSGRID, New UpdateStatusGridParam(IniFile.m_bDrawShowGrid, IniFile.m_bShowGridFrame)) ' imposto tipo coordinate m_bCPlaneTypePos = True Application.Msn.NotifyColleagues(Application.STATUSCURRPOSTYPETEXT, "GRID") m_ProjectScene.SetGridCursorPos(m_bCPlaneTypePos) ' modo di visualizzazione Dim nShowMode As Integer = GetPrivateProfileInt(S_SCENE, K_SHOWMODE, SM.SHADING) Application.Msn.NotifyColleagues(Application.SHOWMODESTATE, nShowMode) ' visualizzazione direzione curve Dim nShowCurveDir As Integer = GetPrivateProfileInt(S_SCENE, K_CURVEDIR, 0) Application.Msn.NotifyColleagues(Application.SHOWCURVEDIR, nShowCurveDir) ' visualizzazione avanzata dei triangoli costituenti le superfici Dim bShowTriaAdv As Boolean = (GetPrivateProfileInt(S_SCENE, K_SHOWTRIAADV, 1) <> 0) EgtSetShowTriaAdv(bShowTriaAdv) ' tipo visualizzazione per Zmap Dim nShowZmap As Integer = GetPrivateProfileInt(S_SCENE, K_SHOWZMAP, 1) EgtSetShowZmap(nShowZmap, False) ' lettura da ini della variabile che abilita i gruppi di lavorazione IniFile.m_bMachiningGroup = (GetPrivateProfileInt(S_MACH, K_MACHININGGROUP, 0) <> 0) Application.Msn.NotifyColleagues(Application.DRAWMODE_ISCHECKED) ' lettura flag visualizzazione solo tavola in definizione lavorazioni IniFile.m_bShowOnlyTable = (GetPrivateProfileInt(S_MACH, K_SHOWONLYTABLE, 1) <> 0) ' ObjTree non selezionato Application.Msn.NotifyColleagues(Application.UPDATEOBJTREEOLDID, GDB_ID.NULL) ' nascondo input box Application.Msn.NotifyColleagues(Application.RESETINPUTBOX) ' Imposto stato filtro selezione m_ProjectScene.GetObjFilterForSel(m_bSelZeroDim, m_bSelCurve, m_bSelSurf, m_bSelVolume, m_bSelExtra) m_Controller.MouseSetObjFilterForSelect(m_bSelZeroDim, m_bSelCurve, m_bSelSurf, m_bSelVolume, m_bSelExtra) ' Imposto default per export m_Controller.SetDefaultForImageExport(OptionModule.m_nImgWidth, OptionModule.m_nImgHeight) End Sub Private Sub ProcessCommandLine() ' Recupero eventuali parametri da linea di comando Dim bOpen As Boolean = False If Environment.GetCommandLineArgs.Count() > 1 Then Dim sFile As String = Environment.GetCommandLineArgs(1) If Not String.IsNullOrWhiteSpace(sFile) Then Dim nFileType As Integer = EgtGetFileType(sFile) Select Case nFileType Case FT.NGE, FT.NFE m_Controller.OpenProject(sFile, False) bOpen = True Case FT.DXF, FT.STL, FT.CNC, FT.CSF, FT.BTL m_Controller.ImportProject(sFile, False) bOpen = True Case FT.TSC, FT.LUA m_Controller.Exec(sFile, False) bOpen = True End Select If IO.Path.GetExtension(sFile).ToLower() = ".ddf" Then ' Se manca direttorio uso quello di default If String.IsNullOrWhiteSpace(IO.Path.GetDirectoryName(sFile)) Then Dim sDefDir As String = String.Empty GetPrivateProfileString(S_DOORS, K_DDFDEFAULTDIR, "", sDefDir) sFile = sDefDir & "\" & sFile End If ' Ricoscimento flag Dim nPar2 As Integer = 0 If Environment.GetCommandLineArgs.Count() > 2 Then nPar2 = CInt(Environment.GetCommandLineArgs(2)) End If Dim bNcGen As Boolean = (nPar2 >= 1) Dim bExit As Boolean = (nPar2 >= 2) ' Esecuzione CreateDoors(sFile, bNcGen, bExit) EgtZoom(ZM.ALL) Application.Msn.NotifyColleagues(Application.EMITTITLE) ' Se richiesta uscita immediata If bExit Then Application.Msn.NotifyColleagues(Application.CLOSEAPPLICATIONCOMMAND) End If End If End If End If End Sub Private Sub EmitTitle() ' nome file Dim sTitle As String = m_Controller.GetCurrFile() If String.IsNullOrEmpty(sTitle) Then sTitle = EgtMsg(MSG_TOPCOMMANDBAR + 1) & IniFile.m_nInstance.ToString() End If ' indicazione di modificato If m_Controller.GetModified() Then sTitle += "*" End If ' dati del prodotto sTitle += " - EgtCAM5" ' emissione del titolo Application.Msn.NotifyColleagues(Application.UPDATEMAINWINDOWTITLE, sTitle) End Sub Private Sub LoadGridData() IniFile.dSnapStepMm = GetPrivateProfileDouble(S_GRID, K_SNAPSTEP, 10) IniFile.dSnapStepInch = GetPrivateProfileDouble(S_GRID, K_SNAPSTEPINCH, 10) IniFile.nMinLineSStep = GetPrivateProfileInt(S_GRID, K_MINLINESSTEP, 1) IniFile.nMajLineSStep = GetPrivateProfileInt(S_GRID, K_MAJLINESSTEP, 10) IniFile.nExtSStep = GetPrivateProfileInt(S_GRID, K_EXTSSTEP, 50) IniFile.MinLnColor = New Color3d(160, 160, 160) GetPrivateProfileColor(S_GRID, K_MINLNCOLOR, IniFile.MinLnColor) IniFile.MajLnColor = New Color3d(160, 160, 160) GetPrivateProfileColor(S_GRID, K_MAJLNCOLOR, IniFile.MajLnColor) EgtSetGridFrame(Frame3d.GLOB) UpdateGridData() End Sub Private Sub UpdateGridData() If IniFile.m_bMmUnits Then EgtSetGridGeo(IniFile.dSnapStepMm, IniFile.nMinLineSStep, IniFile.nMajLineSStep, IniFile.nExtSStep) Else EgtSetGridGeo(IniFile.dSnapStepInch, IniFile.nMinLineSStep, IniFile.nMajLineSStep, IniFile.nExtSStep) End If EgtSetGridColor(IniFile.MinLnColor, IniFile.MajLnColor) End Sub Sub RegisterDrawOptionPanelCommands() Application.Msn.Register(Application.NOTIFYINPUTTEXT, Sub(sInputText As String) m_InputText = sInputText End Sub) Application.Msn.Register(Application.SETLASTBOOLEAN, Sub(bBoolean As Boolean) m_Controller.SetLastBoolean(bBoolean) End Sub) Application.Msn.Register(Application.SETLASTINTEGER, Sub(nInteger As Integer) m_Controller.SetLastInteger(nInteger) End Sub) Application.Msn.Register(Application.SHOW, Sub(sString As String) m_Controller.Show(sString) End Sub) Application.Msn.Register(Application.DONE, Sub(sString As String) m_Controller.Done(sString) End Sub) Application.Msn.Register(Application.SAVEOBJECT, Sub(SaveObjectParam As SaveObjectParam) m_Controller.SaveObject(SaveObjectParam.nId, SaveObjectParam.sDir, SaveObjectParam.nType) End Sub) End Sub Sub RegisterStatusBarCommands() Application.Msn.Register(Application.STATUSCURRPOSTYPECOMMAND, Sub() m_bCPlaneTypePos = Not m_bCPlaneTypePos If m_bCPlaneTypePos Then Application.Msn.NotifyColleagues(Application.STATUSCURRPOSTYPETEXT, "GRID") Else Application.Msn.NotifyColleagues(Application.STATUSCURRPOSTYPETEXT, "WORLD") End If m_ProjectScene.SetGridCursorPos(m_bCPlaneTypePos) End Sub) Application.Msn.Register(Application.STATUSUNITSCOMMAND, Sub() IniFile.m_bMmUnits = Not IniFile.m_bMmUnits Application.Msn.NotifyColleagues(Application.UPDATESTATUSUNITS, IniFile.m_bMmUnits) UpdateGridData() EgtDraw() End Sub) End Sub Sub RegisterControllerCommands() Application.Msn.Register(Application.EXECUTECOMMAND, Sub(nCmd As Controller.CMD) m_Controller.ExecuteCommand(nCmd) End Sub) Application.Msn.Register(Application.MANAGEMODIFIED, Sub() Dim AllowClose = m_Controller.ManageModified() Application.Msn.NotifyColleagues(Application.ALLOWWINDOWTOCLOSE, AllowClose) End Sub) End Sub Sub RegisterMainWindowCommands() Application.Msn.Register(Application.LOADGRIDDATA, Sub() LoadGridData() End Sub) Application.Msn.Register(Application.RESETSTATUS, Sub() m_Controller.ResetStatus() End Sub) Application.Msn.Register(Application.EMITTITLE, Sub() EmitTitle() End Sub) Application.Msn.Register(Application.MAINWINDOW_CONTENTRENDERED, Sub() ProcessCommandLine() End Sub) End Sub Private Sub ManageTopCommandBar() Application.Msn.Register(Application.OPENPROJECT, Sub(sFilePath As String) If String.IsNullOrEmpty(sFilePath) Then Dim sDir As String = String.Empty GetPrivateProfileString(S_GENERAL, K_LASTNGEDIR, "", sDir) m_Controller.OpenProject(sDir) Else m_Controller.OpenProject(sFilePath, False) End If Application.Msn.NotifyColleagues(Application.SELECTIDINOBJTREENOMARK, EgtGetCurrLayer()) End Sub) Application.Msn.Register(Application.SAVEPROJECT, Sub() Dim nType As NGE = DirectCast(GetPrivateProfileInt(S_GEOMDB, K_SAVETYPE, NGE.CMPTEXT), NGE) If Not String.IsNullOrWhiteSpace(m_Controller.GetCurrFile()) Then m_Controller.SaveProject(nType) Else Dim sFile As String = String.Empty GetPrivateProfileString(S_GENERAL, K_LASTNGEDIR, "", sFile) sFile.TrimEnd("\"c) sFile += "\New" & IniFile.m_nInstance.ToString() & ".nge" m_Controller.SaveAsProject(sFile, nType) End If End Sub) Application.Msn.Register(Application.SAVEASPROJECT, Sub() Dim nType As NGE = DirectCast(GetPrivateProfileInt(S_GEOMDB, K_SAVETYPE, NGE.CMPTEXT), NGE) Dim sFile As String = m_Controller.GetCurrFile() If String.IsNullOrWhiteSpace(sFile) Then GetPrivateProfileString(S_GENERAL, K_LASTNGEDIR, "", sFile) sFile.TrimEnd("\"c) sFile += "\New" & IniFile.m_nInstance.ToString() & ".nge" End If m_Controller.SaveAsProject(sFile, nType) End Sub) Application.Msn.Register(Application.INSERTPROJECT, Sub() ' eseguo Dim sDir As String = String.Empty GetPrivateProfileString(S_GENERAL, K_LASTNGEDIR, "", sDir) m_Controller.InsertProject(sDir) End Sub) Application.Msn.Register(Application.IMPORTPROJECT, Sub() Dim sDir As String = String.Empty GetPrivateProfileString(S_GENERAL, K_LASTIMPDIR, "", sDir) m_Controller.ImportProject(sDir) Application.Msn.NotifyColleagues(Application.SELECTIDINOBJTREENOMARK, EgtGetCurrLayer()) End Sub) Application.Msn.Register(Application.EXPORTPROJECT, Sub() m_Controller.ExportProject(Path.ChangeExtension(m_Controller.GetCurrFile(), "dxf")) End Sub) Application.Msn.Register(Application.PREEXECSCRIPT, Sub(bScriptInMru As Boolean) m_bScriptInMru = bScriptInMru End Sub) Application.Msn.Register(Application.EXECSCRIPT, Sub(sFilePath As String) If String.IsNullOrEmpty(sFilePath) Then Dim sDir As String = String.Empty GetPrivateProfileString(S_GENERAL, K_LASTLUADIR, "", sDir) m_Controller.Exec(sDir) Else m_Controller.Exec(sFilePath, False) End If Application.Msn.NotifyColleagues(Application.SELECTIDINOBJTREENOMARK, EgtGetCurrLayer()) If EgtGetCurrMachGroup() <> GDB_ID.NULL Then Application.Msn.NotifyColleagues(Application.SETMACHININGMODE) End If End Sub) Application.Msn.Register(Application.DOORSSCRIPT, Sub(sFilePath As String) Dim bOk As Boolean If String.IsNullOrEmpty(sFilePath) Then bOk = ExecDoors(m_ProjectScene, String.Empty) Else bOk = ExecDoors(m_ProjectScene, sFilePath) End If EgtResetCurrPartLayer() OnUpdateUI(Nothing, True) Application.Msn.NotifyColleagues(Application.SELECTIDINOBJTREENOMARK, EgtGetCurrLayer()) If bOk Then IniFile.m_MruDoors.Add(IniFile.m_DDFFilePath) Dim sFile As String = String.Empty If EgtGetCurrFilePath(sFile) Then IniFile.m_MruFiles.Add(sFile) End If Else Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSOUTPUT, EgtMsg(MSG_DOORSERRORS + 2)) IniFile.m_MruDoors.Remove(IniFile.m_DDFFilePath) Try Dim sErrFilePath As String = Path.ChangeExtension(IniFile.m_DDFFilePath, ".txt") Dim fileReader As String = My.Computer.FileSystem.ReadAllText(sErrFilePath) Dim Lines() As String = fileReader.Split(ControlChars.CrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) Dim values() As String = Lines(0).Split(CChar("=")).ToArray Lines(0) = EgtMsg(MSG_DOORSERRORS + 1) & " " & Convert.ToInt32(values(1)) fileReader = String.Empty For Index = 1 To Lines.Count - 1 fileReader &= (Lines(Index) + ControlChars.CrLf.ToCharArray()) Next MessageBox.Show(fileReader, Lines(0).ToUpper, MessageBoxButton.OK, MessageBoxImage.Error) Catch ex As Exception MessageBox.Show(EgtMsg(MSG_DOORSERRORS + 7)) End Try End If End Sub) Application.Msn.Register(Application.DMACHSCRIPT, Sub() Dim bOk As Boolean = ExecDoorsMachining(m_ProjectScene) OnUpdateUI(Nothing, True) If EgtGetCurrMachGroup() <> GDB_ID.NULL Then Application.Msn.NotifyColleagues(Application.SETMACHININGMODE) End If If Not bOk Then Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSOUTPUT, EgtMsg(MSG_DOORSERRORS + 2)) End Sub) Application.Msn.Register(Application.GUNSTOCKNEW, Sub(sFilePath As String) Dim bOk As Boolean If String.IsNullOrEmpty(sFilePath) Then bOk = ExecGunStockMod(m_ProjectScene, String.Empty) Else bOk = ExecGunStockMod(m_ProjectScene, sFilePath) End If EgtResetCurrPartLayer() OnUpdateUI(Nothing, True) Application.Msn.NotifyColleagues(Application.SELECTIDINOBJTREENOMARK, EgtGetCurrLayer()) If EgtGetCurrMachGroup() <> GDB_ID.NULL Then Application.Msn.NotifyColleagues(Application.SETMACHININGMODE) End If If bOk Then IniFile.m_MruNewGunStock.Add(IniFile.m_MODFilePath) IniFile.m_MruModifyGunStock.Add(IniFile.m_PEZFilePath) Dim sFile As String = String.Empty If EgtGetCurrFilePath(sFile) Then IniFile.m_MruFiles.Add(sFile) End If Else IniFile.m_MruNewGunStock.Remove(IniFile.m_MODFilePath) If Not String.IsNullOrEmpty(IniFile.m_PEZFilePath) Then Try Dim sErrFilePath As String = Path.ChangeExtension(IniFile.m_PEZFilePath, ".txt") Dim fileReader As String = My.Computer.FileSystem.ReadAllText(sErrFilePath) Dim Lines() As String = fileReader.Split(ControlChars.CrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) Dim values() As String = Lines(0).Split(CChar("=")).ToArray Lines(0) = EgtMsg(MSG_DOORSERRORS + 1) & " " & Convert.ToInt32(values(1)) fileReader = String.Empty For Index = 1 To Lines.Count - 1 fileReader &= (Lines(Index) + ControlChars.CrLf.ToCharArray()) Next MessageBox.Show(fileReader, Lines(0).ToUpper, MessageBoxButton.OK, MessageBoxImage.Error) Catch ex As Exception MessageBox.Show(EgtMsg(MSG_DOORSERRORS + 7)) End Try End If End If End Sub) Application.Msn.Register(Application.GUNSTOCKMODIF, Sub(sFilePath As String) Dim bOk As Boolean If String.IsNullOrEmpty(sFilePath) Then bOk = ExecGunStockPez(m_ProjectScene, String.Empty) Else bOk = ExecGunStockPez(m_ProjectScene, sFilePath) End If EgtResetCurrPartLayer() OnUpdateUI(Nothing, True) Application.Msn.NotifyColleagues(Application.SELECTIDINOBJTREENOMARK, EgtGetCurrLayer()) If EgtGetCurrMachGroup() <> GDB_ID.NULL Then Application.Msn.NotifyColleagues(Application.SETMACHININGMODE) End If If bOk Then IniFile.m_MruModifyGunStock.Add(IniFile.m_PEZFilePath) Dim sFile As String = String.Empty If EgtGetCurrFilePath(sFile) Then IniFile.m_MruFiles.Add(sFile) End If Else IniFile.m_MruModifyGunStock.Remove(IniFile.m_PEZFilePath) Try Dim sErrFilePath As String = Path.ChangeExtension(IniFile.m_PEZFilePath, ".txt") Dim fileReader As String = My.Computer.FileSystem.ReadAllText(sErrFilePath) Dim Lines() As String = fileReader.Split(ControlChars.CrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) Dim values() As String = Lines(0).Split(CChar("=")).ToArray Lines(0) = EgtMsg(MSG_DOORSERRORS + 1) & " " & Convert.ToInt32(values(1)) fileReader = String.Empty For Index = 1 To Lines.Count - 1 fileReader &= (Lines(Index) + ControlChars.CrLf.ToCharArray()) Next MessageBox.Show(fileReader, Lines(0).ToUpper, MessageBoxButton.OK, MessageBoxImage.Error) Catch ex As Exception MessageBox.Show(EgtMsg(MSG_DOORSERRORS + 7)) End Try End If End Sub) End Sub Private Sub ManageClosingApplication() Application.Msn.Register(Application.CLOSEAPPLICATION, Sub() If Not IniFile.m_bFailedRun Then ' Salvo modo di visualizzazione WritePrivateProfileString(S_SCENE, K_SHOWMODE, EgtGetShowMode().ToString) ' Salvo stato visualizzazione direzione curve WritePrivateProfileString(S_SCENE, K_CURVEDIR, If(EgtGetShowCurveDirection(), 1, 0).ToString) ' Salvo stato visualizzazione griglia WritePrivateProfileString(S_GRID, K_DRAWSHOWGRID, If(IniFile.m_bDrawShowGrid, 1, 0).ToString) WritePrivateProfileString(S_GRID, K_MACHININGSHOWGRID, If(IniFile.m_bMachiningShowGrid, 1, 0).ToString) ' Salvo stato unità di misura per interfaccia utente WritePrivateProfileString(S_SCENE, K_MMUNITS, If(IniFile.m_bMmUnits, 1, 0).ToString) ' Salvo dimensioni griglie in Mm e Inch WritePrivateProfileString(S_GRID, K_SNAPSTEP, DoubleToString(IniFile.dSnapStepMm, 4)) WritePrivateProfileString(S_GRID, K_SNAPSTEPINCH, DoubleToString(IniFile.dSnapStepInch, 4)) End If End Sub) End Sub #End Region #Region "SCENE EVENTS" Private Sub OnCursorPos(ByVal sender As Object, ByVal sCursorPos As String) Handles m_ProjectScene.OnCursorPos Application.Msn.NotifyColleagues(Application.NOTIFYCURRPOS, sCursorPos) End Sub Private Sub OnMouseSetObjFilterForSelect(sender As Object, bZeroDim As Boolean, bCurve As Boolean, bSurf As Boolean, bVolume As Boolean, bExtra As Boolean) Handles m_ProjectScene.OnMouseSetObjFilterForSelect m_Controller.MouseSetObjFilterForSelect(bZeroDim, bCurve, bSurf, bVolume, bExtra) End Sub Private Sub OnMouseSelectedAll(ByVal sender As Object) Handles m_ProjectScene.OnMouseSelectedAll ' Se in modalità Draw seleziono tutto If IniFile.m_ProjectMode = ProjectModeOpt.DRAW OrElse IniFile.m_ProjectMode = ProjectModeOpt.ONLYDRAW Then m_Controller.MouseSelectedAll() Return End If ' Sono in modalità Machining, se la modalità di selezione è NULL non seleziono nulla ed esco If m_SceneSelMode = SceneSelModeOpt.NULL Then Return Select Case m_SceneSelType Case SceneSelTypeOpt.MACHINING ' Cerco i pezzi all'interno dei grezzi Dim nRawPart As Integer = EgtGetFirstRawPart() While nRawPart <> GDB_ID.NULL Dim nPart As Integer = EgtGetFirstPartInRawPart(nRawPart) While nPart <> GDB_ID.NULL Dim nLayer As Integer = EgtGetFirstGroupInGroup(nPart) While nLayer <> GDB_ID.NULL Dim nObj As Integer = EgtGetFirstInGroup(nLayer) While nObj <> GDB_ID.NULL EgtSelectObj(nObj) nObj = EgtGetNext(nObj) End While nLayer = EgtGetNextGroup(nLayer) End While nPart = EgtGetNextPartInRawPart(nPart) End While nRawPart = EgtGetNextRawPart(nRawPart) End While Case SceneSelTypeOpt.FIXTURE Dim nFixtureId As Integer = EgtGetFirstFixture() While nFixtureId <> GDB_ID.NULL EgtSelectObj(nFixtureId) nFixtureId = EgtGetNextFixture(nFixtureId) End While Dim SelCount As Integer = EgtGetSelectedObjCount() If SelCount > 1 Then EgtSetMark(EgtGetFirstSelectedObj) End If Case SceneSelTypeOpt.RAWPART Dim nRawPartId As Integer = EgtGetFirstRawPart() While nRawPartId <> GDB_ID.NULL If EgtVerifyRawPartCurrPhase(nRawPartId) Then EgtSelectObj(nRawPartId) End If nRawPartId = EgtGetNextRawPart(nRawPartId) End While Dim SelCount As Integer = EgtGetSelectedObjCount() If SelCount > 1 Then EgtSetMark(EgtGetFirstSelectedObj) End If Case SceneSelTypeOpt.RAWPARTWITHFIXTURE Dim nRawPartCount As Integer = 0 Dim nRawPartId As Integer = EgtGetFirstRawPart() While nRawPartId <> GDB_ID.NULL If EgtVerifyRawPartCurrPhase(nRawPartId) Then nRawPartCount += 1 EgtSelectObj(nRawPartId) DispositionUtility.SelectRawPartFixture(nRawPartId) End If nRawPartId = EgtGetNextRawPart(nRawPartId) End While If nRawPartCount > 1 Then EgtSetMark(EgtGetFirstSelectedObj) End If End Select EgtDraw() End Sub Private Sub OnMouseDeselectedAll(ByVal sender As Object) Handles m_ProjectScene.OnMouseDeselectedAll ' Se in modalità Draw seleziono tutto If IniFile.m_ProjectMode = ProjectModeOpt.DRAW OrElse IniFile.m_ProjectMode = ProjectModeOpt.ONLYDRAW Then m_Controller.MouseDeselectedAll() Return End If ' Sono in modalità Machining, se la modalità di selezione è NULL non seleziono nulla ed esco If m_SceneSelMode = SceneSelModeOpt.NULL Then Return ' Se sono in lavorazione If IniFile.m_ProjectMode = ProjectModeOpt.MACHINING Then If (m_SceneSelType = SceneSelTypeOpt.RAWPART OrElse m_SceneSelType = SceneSelTypeOpt.FIXTURE OrElse m_SceneSelType = SceneSelTypeOpt.RAWPARTWITHFIXTURE) Then EgtResetMark(EgtGetFirstSelectedObj()) ElseIf m_SceneSelType = SceneSelTypeOpt.NULL Then Return End If End If ' deseleziono tutto m_Controller.MouseDeselectedAll() End Sub ' Identificativi per elemento da selezionare/deselezionare Private m_nIdToSel As Integer = GDB_ID.NULL Private m_nIdToDesel As Integer = GDB_ID.NULL 'Private m_nFirstRawPartId As Integer = GDB_ID.NULL ' Dati per Drag Private m_nRestRadius As Integer = 3 Private m_bDrag As Boolean = False Private m_bDragToStart As Boolean = False Private m_bDragging As Boolean = False Private m_locPrev As System.Drawing.Point Private m_ptPrev As Point3d Private Sub OnMouseDown(ByVal sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles m_ProjectScene.OnMouseDownScene ' Se in modalità Draw accetto tutto If IniFile.m_ProjectMode = ProjectModeOpt.DRAW OrElse IniFile.m_ProjectMode = ProjectModeOpt.ONLYDRAW Then Return ' Sono in modalità Machining ' se non posso selezionare nulla o in lavorazione esco If m_SceneSelType = SceneSelTypeOpt.NULL OrElse m_SceneSelType = SceneSelTypeOpt.MACHINING Then Return ' Si può selezionare solo con il tasto sinistro If e.Button <> Forms.MouseButtons.Left Then Return ' Per default no drag m_bDrag = False Dim nSel As Integer EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel) Dim nId As Integer = EgtGetFirstObjInSelWin() While nId <> GDB_ID.NULL Select Case m_SceneSelType Case SceneSelTypeOpt.FIXTURE Dim nFixtureId As Integer = EgtGetParent(EgtGetParent(nId)) If EgtVerifyFixture(nFixtureId) Then ' Se già selezionato If EgtIsSelectedObj(nFixtureId) Then ' Memorizzo Id da deselezionare m_nIdToDesel = nFixtureId Else ' Memorizzo Id da selezionare m_nIdToSel = nFixtureId End If ' Drag possibile m_bDrag = True Exit While End If Case SceneSelTypeOpt.RAWPART, SceneSelTypeOpt.RAWPARTWITHFIXTURE Dim nRawPartId As Integer = EgtGetParent(nId) If EgtVerifyRawPartCurrPhase(nRawPartId) Then ' Se già selezionato If EgtIsSelectedObj(nRawPartId) Then ' Memorizzo Id da deselezionare m_nIdToDesel = nRawPartId Else ' Memorizzo Id da selezionare m_nIdToSel = nRawPartId End If ' Drag possibile m_bDrag = True Exit While End If End Select nId = EgtGetNextObjInSelWin() End While ' Dati per drag m_locPrev = e.Location Dim TableRef As Point3d EgtGetTableRef(1, TableRef) m_bDrag = m_bDrag AndAlso EgtGetPlaneSnapPoint(e.Location, Vector3d.Z_AX, TableRef.z, m_ptPrev) m_bDragToStart = m_bDrag End Sub Private Sub OnMyMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles m_ProjectScene.OnMouseMoveScene ' Se in modalità Draw esco If IniFile.m_ProjectMode = ProjectModeOpt.DRAW OrElse IniFile.m_ProjectMode = ProjectModeOpt.ONLYDRAW Then If bEnhancedSelIsActive Then EnhancedMouseMoveScene(e) End If Return End If ' Sono in modalità Machining ' Si può selezionare solo con il tasto sinistro se la selezione non è impostata a NULL If e.Button <> Forms.MouseButtons.Left OrElse m_SceneSelType = SceneSelTypeOpt.NULL Then Return ' se non sono in modalità muovi esco If Not m_bMoveInDisposition Then Return ' Se drag non abilitato o già in esecuzione, esco If Not m_bDrag Or m_bDragging Then Return ' Se primo movimento di drag, verifico di aver superato la soglia di movimento in pixel If m_bDragToStart Then If Math.Abs(e.Location.X - m_locPrev.X) < m_nRestRadius And Math.Abs(e.Location.Y - m_locPrev.Y) < m_nRestRadius Then Return End If m_bDragToStart = False End If ' Determino cosa muovere Dim nMoveId = If(m_nIdToSel <> GDB_ID.NULL, m_nIdToSel, GDB_ID.SEL) ' Inizio esecuzione di drag m_bDragging = True ' Ricavo il punto corrente in coordinate mondo Dim ptCurr As Point3d Dim TableRef As Point3d EgtGetTableRef(1, TableRef) EgtGetPlaneSnapPoint(e.Location, Vector3d.Z_AX, TableRef.z, ptCurr) ' Ricavo il vettore di movimento (tengo solo XY) Dim vtMove As Vector3d = ptCurr - m_ptPrev vtMove.z = 0 ' Muovo gli oggetti selezionati se consentito DispositionUtility.MoveRawPartPartAndFixture(nMoveId, vtMove) EgtDraw() ' Aggiorno il punto precedente m_ptPrev = ptCurr ' Terminata esecuzione di drag m_bDragging = False End Sub Dim bEnhancedSelecting As Boolean = False Dim nMarkedEntityId As Integer = GDB_ID.NULL ' creo liste in cui mettere curve e superfici Dim CurvesIdList As New List(Of Integer) Dim SurfacesIdList As New List(Of Integer) Dim bEnhancedSelIsActive As Boolean = False Private Sub EnhancedMouseMoveScene(e As System.Windows.Forms.MouseEventArgs) ' se un tasto di modifica è premuto If (Keyboard.Modifiers And ModifierKeys.Control) = ModifierKeys.Control OrElse (Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift OrElse _ (Keyboard.Modifiers And ModifierKeys.Alt) = ModifierKeys.Alt Then ' verifico se c'è un elemento rimasto evidenziato If nMarkedEntityId <> GDB_ID.NULL Then ' lo deevidenzio EgtResetMark(nMarkedEntityId) nMarkedEntityId = GDB_ID.NULL EgtDraw() End If Return End If If bEnhancedSelecting Then Return bEnhancedSelecting = True ' recupero elementi presenti nel quadratino di selezione Dim nSel As Integer EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel) Dim nId As Integer = EgtGetFirstObjInSelWin() ' se esiste almeno un elemento nel quadratino di selezione Dim TempGroup As Integer Dim vtZView As Vector3d Dim vtYView As Vector3d Dim vtXView As Vector3d Dim frView As Frame3d If nId <> GDB_ID.NULL Then ' creo un gruppo temporaneo in cui mettere la proiezione sul piano della vista TempGroup = EgtCreateGroup(GDB_ID.ROOT) EgtSetMode(TempGroup, GDB_MD.HIDDEN) EgtSetLevel(TempGroup, GDB_LV.TEMP) 'EgtSetMode(TempGroup, GDB_MD.STD) 'EgtSetLevel(TempGroup, GDB_LV.USER) CurvesIdList.Clear() SurfacesIdList.Clear() ' calcolo vettori e riferimento del punto di vista corrente Dim dAngVertDeg As Double Dim dAngOrizDeg As Double EgtGetGenericView(dAngVertDeg, dAngOrizDeg) vtZView = Vector3d.FromSpherical(1, dAngVertDeg, dAngOrizDeg) EgtGetViewUp(vtYView) vtXView = vtYView ^ vtZView frView = New Frame3d(Point3d.ORIG, vtXView, vtYView, vtZView) Else If nMarkedEntityId <> GDB_ID.NULL Then EgtResetMark(nMarkedEntityId) nMarkedEntityId = GDB_ID.NULL EgtDraw() End If bEnhancedSelecting = False Return End If While nId <> GDB_ID.NULL ' li metto nelle due liste a seconda del tipo di entità Select Case EgtGetType(nId) Case GDB_TY.CRV_ARC, GDB_TY.CRV_COMPO, GDB_TY.CRV_LINE, GDB_TY.EXT_TEXT Dim nCopyId As Integer = EgtCopyGlob(nId, TempGroup) EgtSetInfo(nCopyId, "OriginalId", nId) CurvesIdList.Add(nCopyId) Case Else ' non faccio nulla End Select nId = EgtGetNextObjInSelWin() End While ' Ricavo il punto corrente in coordinate mondo Dim ptSel As Point3d EgtUnProjectPoint(e.Location, ptSel) Dim ToMarkEntityId As Integer = GDB_ID.NULL ' se la lista di curve non è vuota If CurvesIdList.Count > 0 Then Dim dCurrDist As Double Dim dMinDist As Double ' proietto le curve sul piano di vista 'Dim dAngVertDeg As Double 'Dim dAngOrizDeg As Double 'EgtGetGenericView(dAngVertDeg, dAngOrizDeg) 'Dim vtZView As Vector3d = Vector3d.FromSpherical(1, dAngVertDeg, dAngOrizDeg) 'Dim vtYView As Vector3d 'EgtGetViewUp(vtYView) 'Dim vtXView As Vector3d 'vtXView = vtYView ^ vtZView 'Dim frView As New Frame3d(Point3d.ORIG, vtXView, vtYView, vtZView) EgtScaleGroup(TempGroup, frView, 1, 1, 0) ' ciclo sulle proiezioni Dim bFirst As Boolean = True For Index = 0 To CurvesIdList.Count - 1 ' calcolo la distanza della curva dal punto di selezione per trovare quella a distanza minima If EgtGetMinDistPntSidePointCurve(ptSel, CurvesIdList(Index), vtZView, dCurrDist, New Point3d, New Integer) Then EgtOutLog(CurvesIdList(Index) & " " & dCurrDist) If bFirst OrElse dCurrDist < dMinDist Then dMinDist = dCurrDist EgtGetInfo(CurvesIdList(Index), "OriginalId", ToMarkEntityId) bFirst = False End If End If Next If ToMarkEntityId <> nMarkedEntityId Then EgtResetMark(nMarkedEntityId) EgtSetMark(ToMarkEntityId) nMarkedEntityId = ToMarkEntityId End If Else ' Verifico se sono presenti superfici nell'area di selezione nId = EgtGetFirstObjInSelWin() ' se ne esiste almeno una, creo il vettore normale If nId <> GDB_ID.NULL Then ' ciclo sugli elementi nell'area di selezione per crearne il bordo While nId <> GDB_ID.NULL ' li metto nelle due liste a seconda del tipo di entità Select Case EgtGetType(nId) Case GDB_TY.SRF_FRGN, GDB_TY.SRF_MESH, GDB_TY.VOL_ZMAP Dim nCount As Integer = 0 ' ne calcolo il contorno Dim nSilhouetteId As Integer = EgtGetSurfTmSilhouette(nId, vtZView, TempGroup, GDB_RT.GLOB, nCount) EgtSetInfo(nSilhouetteId, "OriginalId", nId) SurfacesIdList.Add(nSilhouetteId) Case Else ' non faccio nulla End Select nId = EgtGetNextObjInSelWin() End While End If If SurfacesIdList.Count > 0 Then ' lo porto nel punto di vista ' verifico se una di quelle prese è contenuta nelle altre ' se si intersecano solamente calcolo il centro di ciascuna ' e prendo quella con il centro più vicina al punto di selezione ' proietto i contorni sul piano di vista EgtScaleGroup(TempGroup, frView, 1, 1, 0) ' se sono contenuti uno nell'altro, seleziono quello contenuto, ' altrimenti quello dietro EgtGetInfo(SurfacesIdList(0), "OriginalId", ToMarkEntityId) If ToMarkEntityId <> nMarkedEntityId Then EgtResetMark(nMarkedEntityId) EgtSetMark(ToMarkEntityId) nMarkedEntityId = ToMarkEntityId End If Else EgtResetMark(nMarkedEntityId) nMarkedEntityId = GDB_ID.NULL End If End If EgtSaveFile("c:\EgtData\Varie\Temp\ProveSelezione.nge", NGE.CMPTEXT) ' cancello gruppo temporaneo EgtErase(TempGroup) EgtDraw() bEnhancedSelecting = False End Sub Private Sub EnhancedMouseUpScene(e As System.Windows.Forms.MouseEventArgs) ' Se già selezionato If EgtIsSelectedObj(nMarkedEntityId) Then EgtDeselectObj(nMarkedEntityId) Else EgtSelectObj(nMarkedEntityId) End If End Sub Private Sub OnMyMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles m_ProjectScene.OnMouseUpScene ' Se in modalità Draw esco If IniFile.m_ProjectMode = ProjectModeOpt.DRAW OrElse IniFile.m_ProjectMode = ProjectModeOpt.ONLYDRAW Then If bEnhancedSelIsActive Then EnhancedMouseUpScene(e) End If Return End If ' Sono in modalità Machining ' Se eseguito drag If Not m_bDragToStart Then ' Basta reset alla fine ' Se selezione da eseguire ElseIf m_nIdToSel <> GDB_ID.NULL Then ' se sono in modalità sottopezzi If m_SceneSelType = SceneSelTypeOpt.FIXTURE Then ' verifico se il sottopezzo da selezionare è un riferimento If DispositionUtility.FixtureType(m_nIdToSel) = DispositionUtility.FIX_TYPE.REFERENCE _ AndAlso EgtGetSelectedObjCount() > 0 Then ' se ci sono altri oggetti selezionati resetto lo stato di selezione ed esco m_bDrag = False m_nIdToSel = GDB_ID.NULL m_nIdToDesel = GDB_ID.NULL EgtDraw() Return Else ' altrimenti verifico il tipo del primo oggetto selezionato Dim nFirstSelId As Integer = EgtGetFirstSelectedObj() If DispositionUtility.FixtureType(nFirstSelId) = DispositionUtility.FIX_TYPE.REFERENCE Then ' se è un riferimento resetto lo stato di selezione ed esco m_bDrag = False m_nIdToSel = GDB_ID.NULL m_nIdToDesel = GDB_ID.NULL EgtDraw() Return End If End If End If ' marco il primo elemento se questo è il secondo If EgtGetSelectedObjCount() = 1 Then ' marco il primo tra i selezionati Dim nFirstSelObj As Integer = EgtGetFirstSelectedObj() EgtSetMark(nFirstSelObj) End If ' se sono in modalità grezzo con relativi sottopezzi If m_SceneSelType = SceneSelTypeOpt.RAWPARTWITHFIXTURE Then ' seleziono tutti i sottopezzi sotto il grezzo da selezionare DispositionUtility.SelectRawPartFixture(m_nIdToSel) End If ' Eseguo la selezione EgtSelectObj(m_nIdToSel) ' Se deselezione da eseguire ElseIf m_nIdToDesel <> GDB_ID.NULL Then ' se l'elemento da deselezionare è marcato Dim bMarked As Boolean = False EgtGetMark(m_nIdToDesel, bMarked) If bMarked Then ' smarco l'oggetto deselezionato EgtResetMark(m_nIdToDesel) End If ' se sono in modalità ventose o grezzi If m_SceneSelType = SceneSelTypeOpt.RAWPARTWITHFIXTURE Then ' deseleziono tutti i sottopezzi sotto il grezzo da deselezionare DispositionUtility.DeselectRawPartFixture(m_nIdToDesel) End If ' Eseguo la deselezione EgtDeselectObj(m_nIdToDesel) If EgtGetSelectedObjCount() > 1 Then ' marco il primo Dim nFirstSelObj As Integer = EgtGetFirstSelectedObj() EgtSetMark(nFirstSelObj) Else ' smarco il primo ed unico oggetto selezionato Dim nFirstSelObj As Integer = EgtGetFirstSelectedObj() EgtResetMark(nFirstSelObj) End If End If ' Reset m_bDrag = False m_nIdToSel = GDB_ID.NULL m_nIdToDesel = GDB_ID.NULL EgtDraw() End Sub Private Sub OnMouseSelectingObj(ByVal sender As Object, ByVal nId As Integer, ByRef bOk As Boolean) Handles m_ProjectScene.OnMouseSelectingObj ' Se oggetto già rifiutato non faccio le verifiche If Not bOk Then Return ' Se in modalità Draw accetto tutto If IniFile.m_ProjectMode = ProjectModeOpt.DRAW OrElse IniFile.m_ProjectMode = ProjectModeOpt.ONLYDRAW Then ' Se attiva enhanced selection rifiuto tutto If bEnhancedSelIsActive Then bOk = False End If Return End If ' Sono in modalità Machining Select Case m_SceneSelType Case SceneSelTypeOpt.NULL bOk = False Case SceneSelTypeOpt.MACHINING Dim nPartId As Integer = EgtGetParent(EgtGetParent(nId)) If Not IsPartInRaw(nPartId) Then bOk = False End If Case Else bOk = False End Select End Sub Private Sub OnMouseSelectedObj(ByVal sender As Object, ByVal nId As Integer, ByVal bLast As Boolean) Handles m_ProjectScene.OnMouseSelectedObj m_Controller.MouseSelectedObj(nId, bLast) End Sub Private Sub OnMouseSelectedPart(ByVal sender As Object, ByVal nId As Integer) Handles m_ProjectScene.OnMouseSelectedPart m_Controller.MouseSelectedPart(nId) End Sub Private Sub OnMouseSelectedLayer(ByVal sender As Object, ByVal nId As Integer) Handles m_ProjectScene.OnMouseSelectedLayer m_Controller.MouseSelectedLayer(nId) End Sub Private Sub OnMouseSelectedPath(ByVal sender As Object, ByVal nId As Integer, ByVal bHaltOnFork As Boolean) Handles m_ProjectScene.OnMouseSelectedPath m_Controller.MouseSelectedPath(nId, bHaltOnFork) End Sub Private Sub OnMousePointFromSelection(ByVal sender As Object, ByVal nId As Integer, ByVal PtP As Point3d, ByVal nAux As Integer) Handles m_ProjectScene.OnMousePointFromSelection m_Controller.SetPointFromSelection(nId, PtP, nAux) IniFile.m_LastSubEntityId = nAux End Sub Private Sub OnMouseDone(ByVal sender As Object) Handles m_ProjectScene.OnMouseDone m_Controller.Done(m_InputText) End Sub Private Sub OnMouseSelectedPoint(ByVal sender As Object, ByVal PtP As Point3d, ByVal nSep As SEP, ByVal nId As Integer) Handles m_ProjectScene.OnMouseSelectedPoint Dim bDone As Boolean = (Keyboard.Modifiers And ModifierKeys.Control) <> ModifierKeys.Control m_Controller.MouseSelectedPoint(PtP, nSep, nId, bDone) End Sub Private Sub OnMouseSelectedDir(ByVal sender As Object, ByVal VtDir As Vector3d) Handles m_ProjectScene.OnMouseSelectedDir m_Controller.SetLastVector3d(VtDir) End Sub Private Sub OnMouseMoveSelPoint(ByVal sender As Object, ByVal PtP As Point3d) Handles m_ProjectScene.OnMouseMoveSelPoint m_Controller.MouseMoveInSelectionPoint(PtP) End Sub Private Sub OnMouseAnalyzed(ByVal sender As Object, ByVal nId As Integer) Handles m_ProjectScene.OnMouseAnalyzed Application.Msn.NotifyColleagues(Application.UPDATEOBJINOBJTREE, nId) Application.Msn.NotifyColleagues(Application.SELECTIDINOBJTREE, nId) End Sub Private Sub OnShowDistance(ByVal sender As Object, ByVal sDistance As String) Handles m_ProjectScene.OnShowDistance Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSOUTPUT, sDistance) End Sub Private Sub Scene1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles m_ProjectScene.KeyDown ' Con DEL eseguo cancellazione delle entità selezionate If e.KeyData = System.Windows.Forms.Keys.Delete Then m_Controller.SetLastInteger(GDB_ID.SEL) m_Controller.ExecuteCommand(Controller.CMD.DELETE) ' Con SPAZIO ripeto l'ultimo comando ElseIf e.KeyData = System.Windows.Forms.Keys.Space Then m_Controller.RepeatLastCommand() ' Con 'A' e in modalità continuazione, forzo il passaggio ad arco ElseIf e.KeyData = System.Windows.Forms.Keys.A And m_Controller.GetContinue() Then m_Controller.ContinueArcPDP() ' Con 'L' e in modalità continuazione, forzo il passaggio a retta ElseIf e.KeyData = System.Windows.Forms.Keys.L And m_Controller.GetContinue() Then m_Controller.ContinueLine2P() ' Con 'V' cambio lo stato del check ElseIf e.KeyData = System.Windows.Forms.Keys.V Then Application.Msn.NotifyColleagues(Application.CHANGEINPUTBOXCHECK) End If End Sub #End Region #Region "CONTROLLER EVENTS" Private Sub OnNewProject(ByVal sender As Object, ByVal bOk As Boolean) Handles m_Controller.OnNewProject EgtZoom(ZM.ALL) If Not bOk Then MessageBox.Show(EgtMsg(10002), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error on new file - Error End If End Sub Private Sub OnOpeningProject(ByVal sender As Object) Handles m_Controller.OnOpeningProject Application.Msn.NotifyColleagues(Application.CLEAROBJTREE) End Sub Private Sub OnOpenProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) Handles m_Controller.OnOpenProject EgtZoom(ZM.ALL) WritePrivateProfileString(S_GENERAL, K_LASTNGEDIR, Path.GetDirectoryName(sFile)) If bOk Then IniFile.m_MruFiles.Add(sFile) Else IniFile.m_MruFiles.Remove(sFile) Dim sMsg As String = EgtMsg(10003) & " '" & sFile & "'" 'Error opening file MessageBox.Show(sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error End If End Sub Private Sub OnInsertedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) Handles m_Controller.OnInsertedProject EgtZoom(ZM.ALL) End Sub Private Sub OnSavingProject(ByVal sender As Object, ByVal sFile As String) Handles m_Controller.OnSavingProject End Sub Private Sub OnSavedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) Handles m_Controller.OnSavedProject WritePrivateProfileString(S_GENERAL, K_LASTNGEDIR, Path.GetDirectoryName(sFile)) If bOk Then IniFile.m_MruFiles.Add(sFile) Else IniFile.m_MruFiles.Remove(sFile) Dim sMsg As String = EgtMsg(10004) & " '" & sFile & "'" 'Error saving file MessageBox.Show(sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error End If End Sub Private Sub OnSavingObject(ByVal sender As Object, ByVal sFile As String) Handles m_Controller.OnSavingObject End Sub Private Sub OnSavedObject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) Handles m_Controller.OnSavedObject WritePrivateProfileString(S_GENERAL, K_LASTNGEOBJDIR, Path.GetDirectoryName(sFile)) If bOk Then IniFile.m_MruFiles.Add(sFile) Else IniFile.m_MruFiles.Remove(sFile) Dim sMsg As String = EgtMsg(10004) & " '" & sFile & "'" 'Error saving file MessageBox.Show(sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error End If End Sub Private Sub OnImportingProject(sender As Object, nType As Integer, ByRef nFlag As Integer) Handles m_Controller.OnImportingProject If nType <> FT.NULL Then Application.Msn.NotifyColleagues(Application.CLEAROBJTREE) If nType = FT.CNC Then nFlag = GetPrivateProfileInt(S_IMPORT, K_CNCFLAG, EIC_FL.NONE) ElseIf nType = FT.BTL Then nFlag = GetPrivateProfileInt(S_IMPORT, K_BTLFLAG, EIC_FL.NONE) Else nFlag = 0 End If Else MessageBox.Show(EgtMsg(10005), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' File type unknown - Error End If End Sub Private Sub OnImportedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) Handles m_Controller.OnImportedProject EgtZoom(ZM.ALL) WritePrivateProfileString(S_GENERAL, K_LASTIMPDIR, Path.GetDirectoryName(sFile)) If Not bOk Then Dim sMsg As String = EgtMsg(10006) & " '" & sFile & "'" 'Error importing file MessageBox.Show(sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error End If End Sub Private Sub OnExportingProject(ByVal sender As Object) Handles m_Controller.OnExportingProject End Sub Private Sub OnExportedProject(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean) Handles m_Controller.OnExportedProject WritePrivateProfileString(S_GENERAL, K_LASTEXPDIR, Path.GetDirectoryName(sFile)) If Not bOk Then Dim sMsg As String = EgtMsg(10007) & " '" & sFile & "'" 'Error exporting file MessageBox.Show(sMsg, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error End If End Sub Private Sub OnExecutingScript(ByVal sender As Object) Handles m_Controller.OnExecutingScript Application.Msn.NotifyColleagues(Application.CLEAROBJTREE) 'Abilito progress e bottone stop Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSPROGRESS, 0) Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSSTOP, True) ' Dichiaro script in esecuzione m_bScriptRunning = True End Sub Private Sub OnExecutedScript(ByVal sender As Object, ByVal sFile As String, ByVal bOk As Boolean, ByVal sError As String) Handles m_Controller.OnExecutedScript ' Salvo path dello script in lista recenti WritePrivateProfileString(S_GENERAL, K_LASTLUADIR, Path.GetDirectoryName(sFile)) If bOk Then If m_bScriptInMru Then IniFile.m_MruScripts.Add(sFile) Else If m_bScriptInMru Then IniFile.m_MruScripts.Remove(sFile) MessageBox.Show(sError, EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) ' Error End If ' Disabilito progress e bottone stop Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSPROGRESS, 0) Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSSTOP, False) '' Dichiaro terminata esecuzione script m_bScriptRunning = False End Sub Private Sub OnPrepareInputBox(ByVal sTitle As String, ByVal sLabel As String, ByVal sCheckLabel As String, ByVal bShowCombo As Boolean, ByVal bShowBtn As Boolean) Handles m_Controller.PrepareInputBox Application.Msn.NotifyColleagues(Application.PREPAREINPUTBOX, New PrepareInputBoxParam(sTitle, sLabel, sCheckLabel, bShowCombo, bShowBtn)) End Sub Private Sub OnSetInputBoxText(ByVal sText As String) Handles m_Controller.SetInputBoxText Application.Msn.NotifyColleagues(Application.SETINPUTBOXTEXT, sText) End Sub Private Sub OnSetInputBoxCheck(ByVal bCheck As Boolean) Handles m_Controller.SetInputBoxCheck Application.Msn.NotifyColleagues(Application.SETINPUTBOXCHECK, bCheck) End Sub Private Sub OnAddInputBoxCombo(ByVal sText As String, ByVal bSelected As Boolean) Handles m_Controller.AddInputBoxCombo Application.Msn.NotifyColleagues(Application.ADDINPUTBOXCOMBO, New AddInputBoxComboParam(sText, bSelected)) End Sub Private Sub OnUpdateUI(ByVal sender As Object, ByVal bReloadUI As Boolean) Handles m_Controller.UpdateUI ' pulisco input e relativi messaggi Application.Msn.NotifyColleagues(Application.RESETINPUTBOX) If m_Controller.GetContinue() Then Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSOUTPUT, (EgtMsg(399))) ' Continue : 'L' with line, 'A' with arc Else Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSOUTPUT, ("")) End If ' aggiorno dati correnti EmitTitle() EmitCurrPartLayer() If bReloadUI Then Application.Msn.NotifyColleagues(Application.LOADOBJTREE) Else Application.Msn.NotifyColleagues(Application.UPDATEOBJTREE) End If ' aggiorno macchina corrente Application.Msn.NotifyColleagues(Application.UPDATECURRENTMACHINE) End Sub Private Sub OutputInfo(ByVal sender As Object, ByVal sText As String) Handles m_Controller.OutputInfo Application.Msn.NotifyColleagues(Application.NOTIFYSTATUSOUTPUT, sText) End Sub #End Region #Region "STATUSBAR EVENTS" Private Sub ProjectScene_OnChangedSnapPointType(ByVal sender As Object, ByVal nSpType As SP, ByVal bUser As Boolean) Handles m_ProjectScene.OnChangedSnapPointType If bUser Then Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPEBACKGROUND, New SolidColorBrush(SystemColors.ControlColor)) Else Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPEBACKGROUND, Brushes.Bisque) End If Select Case nSpType Case SP.PT_SKETCH Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1102)) 'Sketch Point Case SP.PT_GRID Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1104)) 'Grid Point Case SP.PT_END Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1106)) 'End Point Case SP.PT_MID Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1108)) 'Mid Point Case SP.CENTER Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1110)) 'Center Case SP.CENTROID Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1112)) 'Centroid Case SP.PT_NEAR Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1114)) 'Near Point Case SP.PT_INTERS Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1116)) 'Inters Point Case SP.PT_TANGENT Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1118)) 'Tang Point Case SP.PT_PERPENDICULAR Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1120)) 'Perp Point Case SP.PT_MINDIST Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, EgtMsg(1122)) 'MinDist Point Case Else Application.Msn.NotifyColleagues(Application.STATUSSNAPPOINTTYPETEXT, "---") End Select End Sub #End Region ' StatusBar events #Region "DrawOptionPanel" Private Sub EmitCurrPartLayer() Dim sText As String = " " Dim sName As String = String.Empty Dim colObj As Color3d EgtGetColor(GDB_ID.ROOT, colObj) Dim nCurrPart As Integer = m_Controller.GetCurrPart() If nCurrPart <> GDB_ID.NULL Then If EgtGetName(nCurrPart, sName) Then sText = sName Else sText = "Part " + nCurrPart.ToString() End If EgtGetCalcColor(nCurrPart, colObj) Dim nCurrLayer As Integer = m_Controller.GetCurrLayer() If nCurrLayer <> GDB_ID.NULL And EgtExistsObj(nCurrLayer) Then If EgtGetName(nCurrLayer, sName) Then sText += " --> " + sName Else sText += " --> Layer " + nCurrLayer.ToString() End If EgtGetCalcColor(nCurrLayer, colObj) End If End If Application.Msn.NotifyColleagues(Application.UPDATEHEADERNAME, sText) colObj.A = 100 Application.Msn.NotifyColleagues(Application.UPDATEHEADERCOLOR, colObj) End Sub #End Region 'DrawOptionPanel #Region "Scene selection" Private m_SceneSelMode As SceneSelModeOpt Friend Property SceneSelMode As SceneSelModeOpt Get Return m_SceneSelMode End Get Set(value As SceneSelModeOpt) If value <> m_SceneSelMode Then m_SceneSelMode = value Select Case m_SceneSelMode Case SceneSelModeOpt.NULL m_ProjectScene.SetObjFilterForSel(False, False, False, False, False) EgtSetObjFilterForSelect(True, True, True, True, True) Case SceneSelModeOpt.PARTCURVES m_ProjectScene.SetObjFilterForSel(False, True, False, False, False) Case SceneSelModeOpt.PARTSURFACES m_ProjectScene.SetObjFilterForSel(False, False, True, False, False) Case SceneSelModeOpt.PARTCURVESANDSURFACES m_ProjectScene.SetObjFilterForSel(False, True, True, False, False) Case SceneSelModeOpt.ALL m_ProjectScene.SetObjFilterForSel(True, True, True, True, True) Case Else m_ProjectScene.SetObjFilterForSel(False, False, False, False, False) End Select End If End Set End Property Private m_SceneSelType As SceneSelTypeOpt Friend Property SceneSelType As SceneSelTypeOpt Get Return m_SceneSelType End Get Set(value As SceneSelTypeOpt) If value <> m_SceneSelType Then m_SceneSelType = value End If End Set End Property Private m_bMoveInDisposition As Boolean Public Property bMoveInDisposition As Boolean Get Return m_bMoveInDisposition End Get Set(value As Boolean) m_bMoveInDisposition = value End Set End Property Friend Function IsPartInRaw(nSearchedPartId As Integer) As Boolean Dim nRawId As Integer = EgtGetFirstRawPart() While nRawId <> GDB_ID.NULL Dim nPartId As Integer = EgtGetFirstPartInRawPart(nRawId) While nPartId <> GDB_ID.NULL If nPartId = nSearchedPartId Then Return True End If nPartId = EgtGetNextPartInRawPart(nPartId) End While nRawId = EgtGetNextRawPart(nRawId) End While Return False End Function #End Region ' Scene selection End Class End Namespace