Imports System.Math Imports System.IO Imports System.Globalization Imports TestEIn.EgtInterface Public Class Scene '---- Constants ------- Public Const DIM_SEL As Integer = 13 '---- Members --------- Private m_nGseContext As Integer Private m_nStatus As ST Private m_nOldStatus As ST Private Enum ST As Integer NULL = 0 PAN = 1 ROT = 2 ZOOMWIN = 3 WINSEL = 4 ANALYZE = 5 GETDIST = 6 GETDIST2 = 7 SELPOINT = 8 End Enum Private m_nSnapType As Integer Private m_PrevPoint As Point Private m_ptPrev As Point3d Private m_nDriver As Integer Private m_b2Buff As Boolean Private m_nColorBits As Integer Private m_nDepthBits As Integer Private m_BackTopColor As Color3d Private m_BackBotColor As Color3d Private m_DefColor As Color3d Private m_MarkColor As Color3d Private m_bZwOutline As Boolean Private m_ZwColor As Color3d Private m_DstLnColor As Color3d '---- Constructor ----- Sub New() ' Chiamata richiesta dalla finestra di progettazione. InitializeComponent() ' Istruzioni di inizializzazione. Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle SetStyle(ControlStyles.Opaque, True) SetStyle(ControlStyles.UserPaint, True) SetStyle(ControlStyles.AllPaintingInWmPaint, True) m_nGseContext = 0 m_nStatus = ST.NULL m_nOldStatus = ST.NULL m_nSnapType = SP.PT_GRID m_PrevPoint = Point.Empty m_nDriver = 3 m_b2Buff = True m_nColorBits = 24 m_nDepthBits = 32 m_BackTopColor.Setup(140, 154, 168) m_BackBotColor.Setup(40, 44, 48) m_DefColor.Setup(255, 165, 0) m_MarkColor.Setup(255, 255, 0) m_bZwOutline = True m_ZwColor.Setup(0, 0, 0) m_DstLnColor.Setup(255, 0, 0) Cursor = Cursors.Default End Sub '---- Initials -------- Public Sub SetViewAttributes(ByVal nDriver As Integer, ByVal b2Buff As Boolean, ByVal nColorBits As Integer, ByVal nDepthBits As Integer) m_nDriver = nDriver m_b2Buff = b2Buff m_nColorBits = nColorBits m_nDepthBits = nDepthBits End Sub Public Sub SetViewBackground(ByRef BackTopColor As Color3d, ByRef BackBotColor As Color3d) m_BackTopColor = BackTopColor m_BackBotColor = BackBotColor End Sub Public Sub SetDefaultMaterial(ByRef DefColor As Color3d) m_DefColor = DefColor End Sub Public Sub SetMarkMaterial(ByRef DefColor As Color3d) m_MarkColor = DefColor End Sub Public Sub SetZoomWinAttribs(ByVal bZwOutline As Boolean, ByRef ZwColor As Color3d) m_bZwOutline = bZwOutline m_ZwColor = ZwColor End Sub Public Sub SetDistLineMaterial(ByRef DstLnColor As Color3d) m_DstLnColor = DstLnColor End Sub 'Mettere EgtInit, EgtSetKey e EgtSetFont nell'evento Load del Form, prima di inizializzare la o le Scene 'Mettere EgtExit nell'evento FormClosing Public Sub Init() m_nGseContext = EgtInitGeomDB() EgtSetDefaultMaterial(m_DefColor) EgtInitScene(Handle, m_nDriver, m_b2Buff, m_nColorBits, m_nDepthBits) EgtSetBackground(m_BackTopColor, m_BackBotColor) EgtSetMarkAttribs(m_MarkColor) EgtSetWinRectAttribs(m_bZwOutline, m_ZwColor) EgtSetGeoLineAttribs(m_DstLnColor) EgtInitTscExec() End Sub Public Function GetCtx() As Integer Return m_nGseContext End Function Protected Overrides Sub OnHandleDestroyed(e As EventArgs) 'EgtExit va spostata nell'evento FormClosing del Form 'EgtExit() End Sub Protected Overrides Sub OnPaint(e As PaintEventArgs) MyBase.OnPaint(e) ' Salvo il contesto corrente e imposto quello della scena Dim nOldGseCtx = EgtGetCurrentContext() If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(m_nGseContext) End If ' Eseguo il disegno EgtDraw() ' Ripristino il contesto originale If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(nOldGseCtx) End If End Sub Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs) MyBase.OnPaintBackground(pevent) End Sub Protected Overrides Sub OnResize(e As System.EventArgs) MyBase.OnResize(e) ' Salvo il contesto corrente e imposto quello della scena Dim nOldGseCtx = EgtGetCurrentContext() If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(m_nGseContext) End If ' Eseguo ridimensionamento vista EgtResize(Width, Height) ' Ripristino il contesto originale If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(nOldGseCtx) End If End Sub '---- Events ---------- Public Event OnMouseSelected(ByVal sender As Object, ByVal nId As Integer, ByVal bLast As Boolean) Public Event OnMouseAnalyzed(ByVal sender As Object, ByVal nId As Integer) Public Event OnMouseDownScene(ByVal sender As Object) Public Event OnCursorPos(ByVal sender As Object, ByVal sCursorPos As String) Public Event OnShowDistance(ByVal sender As Object, ByVal sDistance As String) Public Event OnCloseGetDist(ByVal sender As Object) Public Event OnMouseSelectedPoint(ByVal sender As Object, ByVal PtP As Point3d) Public Event OnMouseMoveSelPoint(ByVal sender As Object, ByVal PtP As Point3d) Public Event OnNewProject(ByVal sender As Object) Public Event OnOpeningProject(ByVal sender As Object) Public Event OnOpenProject(ByVal sender As Object, ByVal sFile As String) Public Event OnSavingProject(ByVal sender As Object, ByVal sFile As String) Public Event OnSavedProject(ByVal sender As Object) Public Event OnImportingProject(ByVal sender As Object) Public Event OnImportedProject(ByVal sender As Object, ByVal sFile As String) Public Event OnExportingProject(ByVal sender As Object, ByVal sFile As String) Public Event OnExportedProject(ByVal sender As Object) Public Event OnExecutingScript(ByVal sender As Object, ByVal sFile As String) Public Event OnExecutedScript(ByVal sender As Object) '---- Mouse ----------- Protected Overrides Sub OnMouseEnter(e As System.EventArgs) MyBase.OnMouseEnter(e) Focus() End Sub Protected Overrides Sub OnMouseDown(e As System.Windows.Forms.MouseEventArgs) ' Imposto il contesto della scena come corrente EgtSetCurrentContext(m_nGseContext) ' --- Pressione tasto sinistro --- If e.Button = Windows.Forms.MouseButtons.Left Then ' se stato WINSEL oppure NULL e premuto SHIFT allora inizio selezione a finestra If m_nStatus = ST.WINSEL Or (m_nStatus = ST.NULL And (Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then Cursor = New Cursor(Me.GetType(), "WinSelect.cur") m_PrevPoint = e.Location m_nStatus = ST.WINSEL ' se stato NULL (selezione) o analisi ElseIf m_nStatus = ST.NULL Or m_nStatus = ST.ANALYZE Then If m_nStatus = ST.NULL Then Cursor = New Cursor(Me.GetType(), "Select.cur") Else Cursor = New Cursor(Me.GetType(), "Analyze.cur") End If Dim nId As Integer = GDB_ID.NULL Dim nSel As Integer EgtSelect(e.Location, DIM_SEL, DIM_SEL, nSel) If nSel = 1 Then nId = EgtGetFirstObjInSelWin() ElseIf nSel > 1 Then Dim MselDlg As New SelectMulti MselDlg.StartPosition = System.Windows.Forms.FormStartPosition.Manual Dim ptScreen As Point = PointToScreen(e.Location) ptScreen.Offset(10, 0) MselDlg.Location = ptScreen If MselDlg.ShowDialog() = System.Windows.Forms.DialogResult.OK Then nId = MselDlg.GetId() End If End If If nId <> GDB_ID.NULL Then If m_nStatus = ST.NULL Then RaiseEvent OnMouseSelected(Me, nId, True) Else RaiseEvent OnMouseAnalyzed(Me, nId) End If End If ' se stato misura di distanza (primo punto) ElseIf m_nStatus = ST.GETDIST Then If EgtGetGraphicSnapPoint(m_nSnapType, e.Location, DIM_SEL, DIM_SEL, m_ptPrev) Then ' salvo il punto di riferimento Dim ptWin As Point3d EgtProjectPoint(m_ptPrev, ptWin) m_PrevPoint = New Point(ptWin.x, ptWin.y) m_nStatus = ST.GETDIST2 End If ' se stato misura di distanza (secondo punto) ElseIf m_nStatus = ST.GETDIST2 Then Dim ptSel As Point3d If EgtGetGraphicSnapPoint(m_nSnapType, e.Location, DIM_SEL, DIM_SEL, ptSel) Then ' disegno la linea (coordinate geo globali) EgtSetGeoLine(m_ptPrev, ptSel) ' calcolo la distanza e il delta e li visualizzo Dim dX As Double = ptSel.x - m_ptPrev.x Dim dY As Double = ptSel.y - m_ptPrev.y Dim dZ As Double = ptSel.z - m_ptPrev.z Dim dDist As Double = Sqrt(dX * dX + dY * dY + dZ * dZ) Dim sOut As New System.Text.StringBuilder sOut.Append("Dist=") sOut.Append(dDist.ToString("F4", CultureInfo.InvariantCulture)) sOut.Append(" dX=") sOut.Append(dX.ToString("F4", CultureInfo.InvariantCulture)) sOut.Append(" dY=") sOut.Append(dY.ToString("F4", CultureInfo.InvariantCulture)) sOut.Append(" dZ=") sOut.Append(dZ.ToString("F4", CultureInfo.InvariantCulture)) ' lancio l'evento per visualizzare la distanza RaiseEvent OnShowDistance(Me, sOut.ToString()) m_nStatus = ST.NULL m_nOldStatus = ST.NULL End If ' se stato selezione punto ElseIf m_nStatus = ST.SELPOINT Then If EgtGetGraphicSnapPoint(m_nSnapType, e.Location, DIM_SEL, DIM_SEL, m_ptPrev) Then RaiseEvent OnMouseSelectedPoint(Me, m_ptPrev) End If End If ' --- Pressione tasto medio (rotella) --- ElseIf e.Button = Windows.Forms.MouseButtons.Middle Then ' se premuto SHIFT entro in zoom a finestra If (Control.ModifierKeys And Keys.Shift) = Keys.Shift Then SaveCurrStatus() m_nStatus = ST.ZOOMWIN Cursor = New Cursor(Me.GetType(), "ZoomWin.cur") ' se premuto CTRL entro in rotazione vista ElseIf (Control.ModifierKeys And Keys.Control) = Keys.Control Then SaveCurrStatus() m_nStatus = ST.ROT Cursor = New Cursor(Me.GetType(), "Rotate.cur") ' altrimenti entro in pan Else SaveCurrStatus() m_nStatus = ST.PAN Cursor = New Cursor(Me.GetType(), "Pan.cur") End If ' salvo il punto in coordinate finestra m_PrevPoint = e.Location ' --- Tutti gli altri casi --- Else MyBase.OnMouseDown(e) End If Focus() RaiseEvent OnMouseDownScene(Me) End Sub Protected Overrides Sub OnMouseUp(e As System.Windows.Forms.MouseEventArgs) ' salvo il contesto corrente e imposto quello della scena Dim nOldGseCtx = EgtGetCurrentContext() If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(m_nGseContext) End If ' --- Rilascio tasto sinistro --- If e.Button = Windows.Forms.MouseButtons.Left Then If m_nStatus = ST.WINSEL Then EgtResetWinRect(True) ' determino entità selezionate Dim Center As Point Center.X = 0.5 * (e.Location.X + m_PrevPoint.X) Center.Y = 0.5 * (e.Location.Y + m_PrevPoint.Y) Dim nH As Integer = Abs(e.Location.X - m_PrevPoint.X) Dim nW As Integer = Abs(e.Location.Y - m_PrevPoint.Y) Dim nSel As Integer EgtSelect(Center, nH, nW, nSel) ' notifico per ogni entità selezionata Dim nId = EgtGetFirstObjInSelWin() While nId <> GDB_ID.NULL Dim nNextId = EgtGetNextObjInSelWin() RaiseEvent OnMouseSelected(Me, nId, (nNextId = GDB_ID.NULL)) nId = nNextId End While ' ritorno allo stato NULL m_nStatus = ST.NULL Cursor = New Cursor(Me.GetType(), "Select.cur") End If ' --- Rilascio tasto medio (rotella) --- ElseIf e.Button = Windows.Forms.MouseButtons.Middle Then If m_nStatus = ST.ZOOMWIN Then EgtResetWinRect(False) EgtZoomWin(m_PrevPoint, e.Location, True) End If ' eventuale ripristino vecchio stato If RestoreStatus() Then ' non devo fare alcunché ' reset dello stato se non NULL ElseIf m_nStatus <> ST.NULL Then m_nStatus = ST.NULL Cursor = New Cursor(Me.GetType(), "Select.cur") End If ' --- Rilascio tasto destro --- ElseIf e.Button = Windows.Forms.MouseButtons.Right Then If m_nStatus = ST.NULL Then MenuScene.Visible = True For Each i As ToolStripItem In MenuScene.Items If i.Name = "cmdSelectAll" Then i.Visible = True ElseIf i.Name = "cmdDeselectAll" Then i.Visible = True ElseIf i.Name = "sepSel1" Then i.Visible = True ElseIf i.Name = "cmdWinSelect" Then i.Visible = True Else i.Visible = False End If Next ElseIf m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Or m_nStatus = ST.SELPOINT Then MenuScene.Visible = True For Each i As ToolStripItem In MenuScene.Items If i.Name = "cmdSketchPoint" Then i.Visible = True DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_SKETCH) ElseIf i.Name = "cmdGridPoint" Then i.Visible = True DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_GRID) ElseIf i.Name = "cmdEndPoint" Then i.Visible = True DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_END) ElseIf i.Name = "cmdMidPoint" Then i.Visible = True DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_MID) ElseIf i.Name = "cmdCenterPoint" Then i.Visible = True DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.CENTER) ElseIf i.Name = "cmdNearPoint" Then i.Visible = True DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_NEAR) Else i.Visible = False End If Next Else MenuScene.Visible = False End If ' --- Tutti gli altri casi --- Else MyBase.OnMouseUp(e) End If ' Ripristino il contesto originale If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(nOldGseCtx) End If End Sub Protected Overrides Sub OnMouseMove(e As System.Windows.Forms.MouseEventArgs) ' salvo il contesto corrente e imposto quello della scena Dim nOldGseCtx = EgtGetCurrentContext() If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(m_nGseContext) End If 'Visualizzo le coordinate del mouse ShowCursorPos(e.Location) ' --- Premuto tasto sinistro --- If e.Button = Windows.Forms.MouseButtons.Left Then If m_nStatus = ST.WINSEL Then Cursor = New Cursor(Me.GetType(), "WinSelect.cur") EgtSetWinRect(m_PrevPoint, e.Location, True) 'Else ' m_nStatus = ST.NULL End If ' --- Premuto tasto centrale (rotella) --- ElseIf e.Button = Windows.Forms.MouseButtons.Middle Then If m_nStatus = ST.ZOOMWIN Then Cursor = New Cursor(Me.GetType(), "ZoomWin.cur") EgtSetWinRect(m_PrevPoint, e.Location, True) 'Il punto di riferimento deve rimanere quello originale ElseIf m_nStatus = ST.ROT Then Cursor = New Cursor(Me.GetType(), "Rotate.cur") EgtRotateCamera(m_PrevPoint, e.Location, True) m_PrevPoint = e.Location ElseIf m_nStatus = ST.PAN Then Cursor = New Cursor(Me.GetType(), "Pan.cur") EgtPanCamera(m_PrevPoint, e.Location, True) m_PrevPoint = e.Location Else m_nStatus = ST.NULL End If ' --- Altri casi dipendenti dallo stato --- ElseIf m_nStatus = ST.WINSEL Then Cursor = New Cursor(Me.GetType(), "WinSelect.cur") ElseIf m_nStatus = ST.ANALYZE Then Cursor = New Cursor(Me.GetType(), "Analyze.cur") ElseIf m_nStatus = ST.GETDIST Then Cursor = New Cursor(Me.GetType(), "GetDist.cur") ElseIf m_nStatus = ST.GETDIST2 Then Cursor = New Cursor(Me.GetType(), "GetDist.cur") Dim ptP As Point3d EgtUnProjectPoint(e.Location, ptP) EgtSetGeoLine(m_ptPrev, ptP) ElseIf m_nStatus = ST.SELPOINT Then Cursor = New Cursor(Me.GetType(), "Select.cur") Dim ptP As Point3d If EgtGetGraphicSnapPoint(SP.PT_SKETCH, e.Location, DIM_SEL, DIM_SEL, ptP) Then RaiseEvent OnMouseMoveSelPoint(Me, ptP) End If Else MyBase.OnMouseMove(e) End If If m_nStatus = ST.NULL Then Cursor = New Cursor(Me.GetType(), "Select.cur") End If ' Ripristino il contesto originale If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(nOldGseCtx) End If End Sub Protected Overrides Sub OnMouseWheel(e As System.Windows.Forms.MouseEventArgs) ' devo essere nello stato NULL o ANALYZE o GETDIST o SELPOINT If m_nStatus <> ST.NULL And m_nStatus <> ST.ANALYZE And m_nStatus <> ST.GETDIST And m_nStatus <> ST.GETDIST2 And m_nStatus <> ST.SELPOINT Then Return End If ' trascuro rotazioni molto piccole If Abs(e.Delta) < 30 Then Return End If ' calcolo coefficiente Const WHEEL_DELTA As Double = 120 Dim dCoeff As Double = 1 - 0.1 * Abs(e.Delta) / WHEEL_DELTA If e.Delta < 0 Then dCoeff = 1 / dCoeff End If ' salvo il contesto corrente e imposto quello della scena Dim nOldGseCtx = EgtGetCurrentContext() If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(m_nGseContext) End If ' eseguo zoom EgtZoomOnPoint(e.Location, dCoeff, True) ' Ripristino il contesto originale If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(nOldGseCtx) End If End Sub Private Sub ShowCursorPos(ByVal WinXY As Point) 'ricavo punto 3d Dim ptWorld As Point3d EgtUnProjectPoint(WinXY, ptWorld) 'ricavo direzione di vista Dim nDir As Integer EgtGetCameraDir(nDir) 'costruisco stringa con dati Dim sCursorPos As New System.Text.StringBuilder Select Case nDir Case VT.TOP, VT.BOTTOM sCursorPos.Append("X=") sCursorPos.Append(ptWorld.x.ToString("F4", CultureInfo.InvariantCulture)) sCursorPos.Append(" Y=") sCursorPos.Append(ptWorld.y.ToString("F4", CultureInfo.InvariantCulture)) Case VT.FRONT, VT.BACK sCursorPos.Append("X=") sCursorPos.Append(ptWorld.x.ToString("F4", CultureInfo.InvariantCulture)) sCursorPos.Append(" Z=") sCursorPos.Append(ptWorld.z.ToString("F4", CultureInfo.InvariantCulture)) Case VT.LEFT, VT.RIGHT sCursorPos.Append("Y=") sCursorPos.Append(ptWorld.y.ToString("F4", CultureInfo.InvariantCulture)) sCursorPos.Append(" Z=") sCursorPos.Append(ptWorld.z.ToString("F4", CultureInfo.InvariantCulture)) Case Else sCursorPos.Append(" ") End Select ' lancio l'evento per visualizzare la stringa RaiseEvent OnCursorPos(Me, sCursorPos.ToString) End Sub Private Sub MenuScene_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles MenuScene.ItemClicked If e.ClickedItem.Name = "cmdSelectAll" Then ElseIf e.ClickedItem.Name = "cmdDeselectAll" Then EgtDeselectAll() EgtDraw() ElseIf e.ClickedItem.Name = "cmdWinSelect" Then m_nStatus = ST.WINSEL ElseIf e.ClickedItem.Name = "cmdSketchPoint" Then m_nSnapType = SP.PT_SKETCH ElseIf e.ClickedItem.Name = "cmdGridPoint" Then m_nSnapType = SP.PT_GRID ElseIf e.ClickedItem.Name = "cmdEndPoint" Then m_nSnapType = SP.PT_END ElseIf e.ClickedItem.Name = "cmdMidPoint" Then m_nSnapType = SP.PT_MID ElseIf e.ClickedItem.Name = "cmdCenterPoint" Then m_nSnapType = SP.CENTER ElseIf e.ClickedItem.Name = "cmdNearPoint" Then m_nSnapType = SP.PT_NEAR End If End Sub '---- Status management ------------- Private Sub SaveCurrStatus() If m_nStatus = ST.WINSEL Or m_nStatus = ST.ANALYZE Or m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Or m_nStatus = ST.SELPOINT Then m_nOldStatus = m_nStatus End If End Sub Private Function RestoreStatus() As Boolean ' eventuale ripristino vecchio stato If m_nOldStatus = ST.WINSEL Then m_nStatus = m_nOldStatus Cursor = New Cursor(Me.GetType(), "WinSelect.cur") Return True ElseIf m_nOldStatus = ST.ANALYZE Then m_nStatus = m_nOldStatus Cursor = New Cursor(Me.GetType(), "Analyze.cur") Return True ElseIf m_nOldStatus = ST.GETDIST Or m_nOldStatus = ST.GETDIST2 Then m_nStatus = m_nOldStatus Cursor = New Cursor(Me.GetType(), "GetDist.cur") Return True ElseIf m_nOldStatus = ST.SELPOINT Then m_nStatus = m_nOldStatus Cursor = New Cursor(Me.GetType(), "Select.cur") Return True End If Return False End Function Public Sub SetStatusAnalyze() m_nStatus = ST.ANALYZE End Sub Public Sub SetStatusGetDistance() m_nStatus = ST.GETDIST End Sub Public Sub SetStatusSelPoint() m_nStatus = ST.SELPOINT End Sub Public Sub ResetStatus(Optional ByVal bRedraw As Boolean = True) ' pulisco eventuali geometrie temporanee EraseDragGroup() EgtResetGeoLine(False) EgtResetWinRect(False) ' imposto lo stato m_nStatus = ST.NULL m_nOldStatus = ST.NULL ' aggiorno visualizzazione If bRedraw Then EgtDraw() End If End Sub Public Sub ResetStatusAnalyze() If m_nStatus = ST.ANALYZE Then m_nStatus = ST.NULL m_nOldStatus = ST.NULL End If End Sub Public Sub ResetStatusGetDistance() If m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Then m_nStatus = ST.NULL m_nOldStatus = ST.NULL End If EgtResetGeoLine() RaiseEvent OnCloseGetDist(Me) End Sub '---- Drag Group ------ Private m_nDragGroup As Integer = GDB_ID.NULL Public Function CreateDragGroup() As Boolean m_nDragGroup = EgtCreateGroup(GDB_ID.ROOT) If m_nDragGroup = GDB_ID.NULL Then Return False End If EgtSetLevel(m_nDragGroup, GDB_LV.TEMP) EgtSetMark(m_nDragGroup) EgtUnselectableAdd(m_nDragGroup) Return True End Function Public Function EraseDragGroup() As Boolean EgtErase(m_nDragGroup) EgtUnselectableRemove(m_nDragGroup) m_nDragGroup = GDB_ID.NULL Return True End Function Public Function AddToDragGroup(ByVal nId As Integer) As Boolean Return EgtCopyGlob(nId, m_nDragGroup, GDB_POS.SON) <> GDB_ID.NULL End Function Public Function GetDragGroup() As Integer Return m_nDragGroup End Function '---- Main Buttons ---- Public Function NewProject() As Boolean Dim bOk As Boolean = EgtNewFile() EgtZoom(ZM.ALL) If bOk Then RaiseEvent OnNewProject(Me) Else MessageBox.Show("Error on new file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Return bOk End Function Public Function OpenProject(Optional ByVal sDir As String = "", Optional ByVal bWithDlg As Boolean = True) As Boolean Dim sFile As String = sDir ' Scelta file con dialogo If bWithDlg Then Dim OpenFileDialog As New OpenFileDialog OpenFileDialog.Title = "Open" OpenFileDialog.Filter = "New geometry EgalTech(*.nge)|*.nge" & "|New font EgalTech(*.nfe)|*.nfe" & "|All Files (*.*)|*.*" OpenFileDialog.FilterIndex = 1 OpenFileDialog.InitialDirectory = sDir If OpenFileDialog.ShowDialog <> Windows.Forms.DialogResult.OK Then Return True End If sFile = OpenFileDialog.FileName End If 'Prima del caricamento RaiseEvent OnOpeningProject(Me) 'Caricamento del progetto Cursor = Cursors.WaitCursor Dim bOk As Boolean = EgtOpenFile(sFile) EgtZoom(ZM.ALL) Cursor = Cursors.Default 'Gestione risultato If bOk Then RaiseEvent OnOpenProject(Me, sFile) Else MessageBox.Show("Error opening file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Return bOk End Function Public Function SaveProject(Optional ByVal sFile As String = "") As Boolean If String.IsNullOrEmpty(sFile) Or EgtGetFileType(sFile) <> FT.NGE Then Return SaveAsProject(sFile) Else 'Prima del salvataggio RaiseEvent OnSavingProject(Me, sFile) 'Salvataggio del progetto Cursor = Cursors.WaitCursor Dim bOk As Boolean = EgtSaveFile(sFile, NGE.CMPTEXT) Cursor = Cursors.Default 'Gestione risultato If bOk Then RaiseEvent OnSavedProject(Me) Else MessageBox.Show("Error saving file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Return bOk End If End Function Public Function SaveAsProject(Optional ByVal sFile As String = "") As Boolean 'Eventuale sistemazione estensione sFile = Path.ChangeExtension(sFile, "nge") 'Assegnazione nome file con dialogo Dim SaveFileDialog As New SaveFileDialog SaveFileDialog.Title = "Save" SaveFileDialog.Filter = "New geometry EgalTech(*.nge)|*.nge" SaveFileDialog.FileName = sFile If SaveFileDialog.ShowDialog <> Windows.Forms.DialogResult.OK Then Return True End If 'Prima del salvataggio RaiseEvent OnSavingProject(Me, SaveFileDialog.FileName) 'Salvataggio del progetto Cursor = Cursors.WaitCursor Dim bOk As Boolean = EgtSaveFile(SaveFileDialog.FileName, NGE.CMPTEXT) Cursor = Cursors.Default 'Gestione risultato If bOk Then RaiseEvent OnSavedProject(Me) Else MessageBox.Show("Error saving file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Return bOk End Function Public Function ImportProject(Optional ByVal sDir As String = "", Optional ByVal bWithDlg As Boolean = True) As Boolean Dim sFile As String = sDir 'Scelta file con dialogo If bWithDlg Then Dim OpenFileDialog As New OpenFileDialog OpenFileDialog.Title = "Import" OpenFileDialog.Filter = "Drawing Exchange Fmt(*.dxf)|*.dxf" & "|Stereolithography (*.stl)|*.stl" & "|Part program ISO (*.cnc)|*.cnc" & "|All Files (*.*)|*.*" OpenFileDialog.FilterIndex = 4 OpenFileDialog.InitialDirectory = sDir If OpenFileDialog.ShowDialog <> Windows.Forms.DialogResult.OK Then Return True End If sFile = OpenFileDialog.FileName End If 'Riconoscimento tipo file Dim nFileType As Integer = EgtGetFileType(sFile) If nFileType <> FT.DXF And nFileType <> FT.STL And nFileType <> FT.CNC Then MessageBox.Show("File type unknown", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End If 'Prima del caricamento RaiseEvent OnImportingProject(Me) 'Pulizia GeomDB Cursor = Cursors.WaitCursor Dim bOk As Boolean = EgtNewFile() 'Importazione If nFileType = FT.DXF Then bOk = bOk And EgtImportDxf(sFile) ElseIf nFileType = FT.STL Then bOk = bOk And EgtImportStl(sFile) ElseIf nFileType = FT.CNC Then bOk = bOk And EgtImportCnc(sFile) End If EgtZoom(ZM.ALL) Cursor = Cursors.Default 'Gestione risultato If bOk Then RaiseEvent OnImportedProject(Me, sFile) Else MessageBox.Show("Error importing file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Return bOk End Function Public Function ExportProject(Optional ByVal sFile As String = "") As Boolean 'Assegnazione nome file con dialogo Dim SaveFileDialog As New SaveFileDialog SaveFileDialog.Title = "Export" SaveFileDialog.Filter = "Drawing Exchange Fmt(*.dxf)|*.dxf" & "|Stereolithography (*.stl)|*.stl" & "|All Files (*.*)|*.*" SaveFileDialog.FilterIndex = 3 SaveFileDialog.FileName = sFile If SaveFileDialog.ShowDialog <> Windows.Forms.DialogResult.OK Then Return True End If 'Riconoscimento tipo file Dim nFileType As Integer = EgtGetFileType(SaveFileDialog.FileName) If nFileType <> FT.DXF And nFileType <> FT.STL Then MessageBox.Show("File type unknown", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End If 'Prima dell'esportazione RaiseEvent OnExportingProject(Me, SaveFileDialog.FileName) 'Esportazione del progetto Cursor = Cursors.WaitCursor Dim bOk As Boolean = False If nFileType = FT.DXF Then bOk = EgtExportDxf(GDB_ID.ROOT, SaveFileDialog.FileName) ElseIf nFileType = FT.STL Then bOk = EgtExportStl(GDB_ID.ROOT, SaveFileDialog.FileName) End If Cursor = Cursors.Default 'Gestione risultato If bOk Then RaiseEvent OnExportedProject(Me) Else MessageBox.Show("Error exporting file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Return bOk End Function Public Function Exec(Optional ByVal sDir As String = "", Optional ByVal bWithDlg As Boolean = True) As Boolean Dim sFile As String = sDir 'Scelta file con dialogo If bWithDlg Then Dim OpenFileDialog As New OpenFileDialog OpenFileDialog.Title = "Exec Script" OpenFileDialog.Filter = "Lua commands(*.lua)|*.lua" & "|Test commands(*.tsc)|*.tsc" & "|All Files (*.*)|*.*" OpenFileDialog.FilterIndex = 1 OpenFileDialog.InitialDirectory = sDir If OpenFileDialog.ShowDialog <> Windows.Forms.DialogResult.OK Then Return True End If sFile = OpenFileDialog.FileName End If 'Ne verifico il tipo Dim sExt As String = UCase(Path.GetExtension(sFile)) If (sExt <> ".LUA" And sExt <> ".TSC") Then MessageBox.Show("Script type unknow", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End If 'Prima dell'esecuzione RaiseEvent OnExecutingScript(Me, sFile) 'Esecuzione Cursor = Cursors.WaitCursor Dim bOk As Boolean = False If (sExt = ".LUA") Then bOk = EgtLuaExecFile(sFile) Else bOk = EgtTscExecFile(sFile) End If EgtZoom(ZM.ALL) Cursor = Cursors.Default 'Gestione risultato If bOk Then RaiseEvent OnExecutedScript(Me) ElseIf (sExt = ".LUA") Then Dim sError As String = String.Empty EgtLuaGetLastError(sError) MessageBox.Show(sError, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show("Error executing file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Return bOk End Function '---- Zoom Buttons ---- Public Sub ZoomAll() EgtZoom(ZM.ALL) End Sub Public Sub ZoomIn() EgtZoom(ZM.IN_) End Sub Public Sub ZoomOut() EgtZoom(ZM.OUT) End Sub '---- Rendering Buttons ---- Public Sub WireFrame() EgtSetShowMode(SM.WIREFRAME) End Sub Public Sub HiddenLine() EgtSetShowMode(SM.HIDDENLINE) End Sub Public Sub Shading() EgtSetShowMode(SM.SHADING) End Sub '---- LookFrom Buttons ---- Public Sub TopView() EgtSetView(VT.TOP) End Sub Public Sub FrontView() EgtSetView(VT.FRONT) End Sub Public Sub BackView() EgtSetView(VT.BACK) End Sub Public Sub LeftView() EgtSetView(VT.LEFT) End Sub Public Sub RightView() EgtSetView(VT.RIGHT) End Sub Public Sub IsoViewSW() EgtSetView(VT.ISO_SW) End Sub Public Sub IsoViewSE() EgtSetView(VT.ISO_SE) End Sub Public Sub IsoViewNE() EgtSetView(VT.ISO_NE) End Sub Public Sub IsoViewNW() EgtSetView(VT.ISO_NW) End Sub End Class