Files
TestEIn/Scene.vb
T
Dario Sassi a7924108a0 TestEIn 1.6b6 :
- gestione MRU per file Nge e script lua
- aggiunto comando merge surfaces.
2015-03-11 09:11:29 +00:00

1102 lines
42 KiB
VB.net

'----------------------------------------------------------------------------
' EgalTech 2014-2015
'----------------------------------------------------------------------------
' File : Scene.vb Data : 27.01.15 Versione : 1.6a6
' Contenuto : Classe Scene (parte di MVC).
'
'
'
' Modifiche : 04.11.14 DS Creazione modulo.
'
'
'----------------------------------------------------------------------------
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
SEL
PAN
ROT
ZOOMWIN
WINSEL
SELPART
SELLAYER
ANALYZE
GETDIST
GETDIST2
SELPOINT
SELPOINTZ
End Enum
Private m_nSnapType As SP ' tipo di snap in selezione punto
Private m_bAlsoSelDir As Boolean ' abilita anche selezione direzione quando selezione punto
Private m_PrevPoint As Point
Private m_ptPrev As Point3d
Private m_ptGrid As Point3d
Private m_bGridCursorPos As Boolean
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_SelSurfColor 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.SEL
m_nOldStatus = ST.SEL
m_nSnapType = SP.PT_GRID
m_bAlsoSelDir = False
m_PrevPoint = Point.Empty
m_bGridCursorPos = False
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_SelSurfColor.Setup(255, 255, 192)
m_bZwOutline = True
m_ZwColor.Setup(0, 0, 0)
m_DstLnColor.Setup(255, 0, 0)
Cursor = New Cursor(Me.GetType(), "Select.cur")
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 SetSelSurfMaterial(ByRef DefColor As Color3d)
m_SelSurfColor = 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
Public Sub SetGridCursorPos(ByVal bGridCursorPos As Boolean)
m_bGridCursorPos = bGridCursorPos
End Sub
'Mettere EgtInit, EgtSetKey, EgtSetFont e EgtSetLuaLibsDir 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)
EgtSetSelSurfAttribs(m_SelSurfColor)
EgtSetWinRectAttribs(m_bZwOutline, m_ZwColor)
EgtSetGeoLineAttribs(m_DstLnColor)
EgtSetGeoTriaAttribs(m_DstLnColor)
EgtInitTscExec()
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
End Sub
Public Function GetCtx() As Integer
Return m_nGseContext
End Function
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 OnMouseSelectedAll(ByVal sender As Object)
Public Event OnMouseDeselectedAll(ByVal sender As Object)
Public Event OnMouseSelectedObj(ByVal sender As Object, ByVal nId As Integer, ByVal bLast As Boolean)
Public Event OnMouseSelectedPart(ByVal sender As Object, ByVal nId As Integer)
Public Event OnMouseSelectedLayer(ByVal sender As Object, ByVal nId As Integer)
Public Event OnMouseAnalyzed(ByVal sender As Object, ByVal nId As Integer)
Public Event OnMousePointFromSelection(ByVal sender As Object, ByVal PtP As Point3d, ByVal nAux 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 OnMouseDone(ByVal sender As Object)
Public Event OnMouseSelectedPoint(ByVal sender As Object, ByVal PtP As Point3d, ByVal nSep As SEP, ByVal nId As Integer)
Public Event OnMouseSelectedDir(ByVal sender As Object, ByVal VtDir As Vector3d)
Public Event OnMouseMoveSelPoint(ByVal sender As Object, ByVal PtP As Point3d)
Public Event OnChangedSnapPointType(ByVal sender As Object, ByVal nSpType As SP)
'---- Mouse -----------
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 SEL e premuto SHIFT allora inizio selezione a finestra
If m_nStatus = ST.WINSEL Or
(m_nStatus = ST.SEL And (ModifierKeys And Keys.Shift) = Keys.Shift) Then
Cursor = New Cursor(Me.GetType(), "WinSelect.cur")
m_PrevPoint = e.Location
m_nStatus = ST.WINSEL
' se stato SEL, SELPART, SELLAYER o ANALYZE
ElseIf m_nStatus = ST.SEL Or m_nStatus = ST.SELPART Or
m_nStatus = ST.SELLAYER Or m_nStatus = ST.ANALYZE Then
If m_nStatus <> ST.ANALYZE 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
' evento per entità selezionate
Select Case m_nStatus
Case ST.SEL
RaiseEvent OnMouseSelectedObj(Me, nId, True)
Case ST.SELPART
RaiseEvent OnMouseSelectedPart(Me, nId)
m_nStatus = ST.SEL
Case ST.SELLAYER
RaiseEvent OnMouseSelectedLayer(Me, nId)
m_nStatus = ST.SEL
Case Else
RaiseEvent OnMouseAnalyzed(Me, nId)
End Select
' evento per posizione punto di selezione
Dim PtTemp As Point3d
Dim nAux As Integer
If EgtGetPointFromSelect(nId, e.Location, PtTemp, nAux) Then
RaiseEvent OnMousePointFromSelection(Me, PtTemp, nAux)
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(EgtMsg(1301)) ' 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.GETDIST
m_nOldStatus = ST.SEL
End If
' se stato selezione punto
ElseIf m_nStatus = ST.SELPOINT Then
If Not m_bDragOn Then
' rendo selezionabile gruppo di drag
If Not m_bDragSelectable Then
EgtUnselectableRemove(m_nDragGroup)
End If
' eseguo selezione
Dim nSel As Integer = GDB_ID.NULL
EgtSelect(e.Location, DIM_SEL, DIM_SEL, nSel)
' ripristino stato precedente di selezionabilità drag
If Not m_bDragSelectable Then
EgtUnselectableAdd(m_nDragGroup)
End If
' click su geometria di drag equivale a Done
Dim nId As Integer = EgtGetFirstObjInSelWin()
While nId <> GDB_ID.NULL
If EgtGetParent(nId) = m_nDragGroup Then
RaiseEvent OnMouseDone(Me)
Exit While
End If
nId = EgtGetNextObjInSelWin()
End While
ElseIf EgtGetGraphicSnapPoint(m_nSnapType, e.Location, DIM_SEL, DIM_SEL, m_ptPrev) Then
' se Snap Sketch o Grid e premuto SHIFT si passa a modalità elevatore
If (m_nSnapType = SP.PT_SKETCH Or m_nSnapType = SP.PT_GRID) And
(ModifierKeys And Keys.Shift) = Keys.Shift Then
m_nStatus = ST.SELPOINTZ
m_ptGrid = m_ptPrev
' altrimenti si restituisce il punto
Else
' se richiesta anche direzione, restituisco prima questa
If m_bAlsoSelDir Then
Dim vtDir As Vector3d
If EgtGetLastSnapDir(vtDir) Then
RaiseEvent OnMouseSelectedDir(Me, vtDir)
End If
End If
' restituisco punto con info ausiliarie
Dim nSep As SEP
If m_nSnapType = SP.PT_TANGENT Then
nSep = SEP.PT_TG
ElseIf m_nSnapType = SP.PT_PERPENDICULAR Then
nSep = SEP.PT_PERP
ElseIf m_nSnapType = SP.PT_MINDIST Then
nSep = SEP.PT_MINDIST
Else
nSep = SEP.PT_STD
End If
RaiseEvent OnMouseSelectedPoint(Me, m_ptPrev, nSep, EgtGetLastSnapId())
End If
End If
' se stato selezione Z di punto
ElseIf m_nStatus = ST.SELPOINTZ Then
If EgtGetGridSnapPointZ((m_nSnapType = SP.PT_SKETCH), e.Location, m_ptGrid, m_ptPrev) Then
' ritorno allo stato base di selezione punto
m_nStatus = ST.SELPOINT
RaiseEvent OnMouseSelectedPoint(Me, m_ptPrev, SEP.PT_STD, GDB_ID.NULL)
' non ci può essere selezione di ddirezione
End If
End If
' --- Pressione tasto medio (rotella) ---
ElseIf e.Button = Windows.Forms.MouseButtons.Middle Then
' devo essere in uno stato ripristinabile
If IsRestorableCurrStatus() Then
' se premuto SHIFT entro in zoom a finestra
If (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 (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
End If
' --- 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 OnMouseSelectedObj(Me, nId, (nNextId = GDB_ID.NULL))
nId = nNextId
End While
' ritorno allo stato SEL
m_nStatus = ST.SEL
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 SEL
ElseIf m_nStatus <> ST.SEL Then
m_nStatus = ST.SEL
Cursor = New Cursor(Me.GetType(), "Select.cur")
End If
' --- Rilascio tasto destro ---
ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
' sistemazioni menù contestuale
PrepareMenuScene()
' --- 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
' Se sono abbastanza all'interno della scena (10% della dimensione), imposto il focus
Const BordPu As Double = 0.10000000000000001
If e.Location.X > BordPu * Size.Width AndAlso e.Location.X < (1 - BordPu) * Size.Width AndAlso
e.Location.Y > BordPu * Size.Height AndAlso e.Location.Y < (1 - BordPu) * Size.Height Then
Focus()
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)
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")
EgtRotateView(m_PrevPoint, e.Location, True)
m_PrevPoint = e.Location
ElseIf m_nStatus = ST.PAN Then
Cursor = New Cursor(Me.GetType(), "Pan.cur")
EgtPanView(m_PrevPoint, e.Location, True)
m_PrevPoint = e.Location
Else
m_nStatus = ST.SEL
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(), "SelPoint.cur")
Dim ptP As Point3d
If EgtGetGraphicSnapPoint(IIf(m_nSnapType = SP.PT_GRID, SP.PT_GRID, SP.PT_SKETCH),
e.Location, DIM_SEL, DIM_SEL, ptP) Then
If m_bDragOn Then
RaiseEvent OnMouseMoveSelPoint(Me, ptP)
End If
End If
ElseIf m_nStatus = ST.SELPOINTZ Then
Cursor = New Cursor(Me.GetType(), "SelPoint.cur")
Dim ptP As Point3d
If EgtGetGridSnapPointZ((m_nSnapType = SP.PT_SKETCH), e.Location, m_ptGrid, ptP) Then
EgtSetGeoLine(m_ptGrid, ptP)
If m_bDragOn Then
RaiseEvent OnMouseMoveSelPoint(Me, ptP)
End If
End If
Else
MyBase.OnMouseMove(e)
End If
If m_nStatus = ST.NULL Then
Cursor = Cursors.Default
ElseIf m_nStatus = ST.SEL 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 in uno stato ripristinabile
If Not IsRestorableCurrStatus() 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.10000000000000001 * 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)
' se coord. griglia e non snap a punto in Z
If (m_bGridCursorPos And m_nStatus <> ST.SELPOINTZ) Then
' calcolo lo snap da utilizzare
Dim nSnap As SP = SP.PT_SKETCH
If m_nStatus = ST.SELPOINT And m_nSnapType = SP.PT_GRID Then
nSnap = SP.PT_GRID
End If
' se riesco a ricavare un punto 3d snap
Dim ptSnap As Point3d
If EgtGetGraphicSnapPoint(nSnap, WinXY, DIM_SEL, DIM_SEL, ptSnap) Then
' porto nel riferimento griglia
ptSnap.ToLoc(EgtGetGridFrame())
' costruisco la stringa
Dim sCursorPos As New System.Text.StringBuilder
sCursorPos.Append("X=")
sCursorPos.Append(ptSnap.x.ToString("F4", CultureInfo.InvariantCulture))
sCursorPos.Append(" Y=")
sCursorPos.Append(ptSnap.y.ToString("F4", CultureInfo.InvariantCulture))
sCursorPos.Append(" Z=")
sCursorPos.Append(ptSnap.z.ToString("F4", CultureInfo.InvariantCulture))
' visualizzazione stringa
RaiseEvent OnCursorPos(Me, sCursorPos.ToString)
Return
End If
End If
' se snap a punto in Z e riesco a ricavare un punto 3d snap
If m_nStatus = ST.SELPOINTZ Then
' se riesco a ricavare un punto Z snap
Dim ptSnap As Point3d
If EgtGetGridSnapPointZ((m_nSnapType = SP.PT_SKETCH), WinXY, m_ptGrid, ptSnap) Then
' se richiesto, porto nel riferimento griglia
If m_bGridCursorPos Then
ptSnap.ToLoc(EgtGetGridFrame())
End If
' costruisco la stringa
Dim sCursorPos As New System.Text.StringBuilder
sCursorPos.Append("X=")
sCursorPos.Append(ptSnap.x.ToString("F4", CultureInfo.InvariantCulture))
sCursorPos.Append(" Y=")
sCursorPos.Append(ptSnap.y.ToString("F4", CultureInfo.InvariantCulture))
sCursorPos.Append(" Z=")
sCursorPos.Append(ptSnap.z.ToString("F4", CultureInfo.InvariantCulture))
' visualizzazione stringa
RaiseEvent OnCursorPos(Me, sCursorPos.ToString)
Return
End If
End If
' in tutti gli altri casi
If True Then
' ricavo il punto 3d da proiezione inversa
Dim ptWorld As Point3d
EgtUnProjectPoint(WinXY, ptWorld)
'ricavo direzione di vista
Dim nDir As Integer
EgtGetView(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 If
End Sub
'---- Contextual Menu management -------------
Private m_bTangentPointOn As Boolean = False
Private m_bPerpendicularPointOn As Boolean = False
Private m_bMinDistPointOn As Boolean = False
Public Sub EnableTangentPoint()
m_bTangentPointOn = True
End Sub
Public Sub EnablePerpendicularPoint()
m_bPerpendicularPointOn = True
End Sub
Public Sub EnableMinDistPoint()
m_bMinDistPointOn = True
End Sub
Public Sub DisableTangentPoint()
m_bTangentPointOn = False
If m_nSnapType = SP.PT_TANGENT Then
m_nSnapType = SP.PT_NEAR
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
End If
End Sub
Public Sub DisablePerpendicularPoint()
m_bPerpendicularPointOn = False
If m_nSnapType = SP.PT_PERPENDICULAR Then
m_nSnapType = SP.PT_NEAR
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
End If
End Sub
Public Sub DisableMinDistPoint()
m_bMinDistPointOn = False
If m_nSnapType = SP.PT_MINDIST Then
m_nSnapType = SP.PT_NEAR
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
End If
End Sub
Private Sub PrepareMenuScene()
' per selezione oggetti
If m_nStatus = ST.SEL Then
For Each i As ToolStripItem In MenuScene.Items
If i.Name = "cmdSelectAll" Then
i.Text = EgtMsg(1001) ' Select All
i.Visible = True
ElseIf i.Name = "cmdDeselectAll" Then
i.Text = EgtMsg(1003) ' Deselect All
i.Visible = True
ElseIf i.Name = "sepSel1" Then
i.Visible = True
ElseIf i.Name = "cmdWinSelect" Then
i.Text = EgtMsg(1005) ' Select Window
i.Visible = True
ElseIf i.Name = "cmdSelectPart" Then
i.Text = EgtMsg(1007) ' Select Part
i.Visible = True
ElseIf i.Name = "cmdSelectLayer" Then
i.Text = EgtMsg(1009) ' Select Layer
i.Visible = True
Else
i.Visible = False
End If
Next
MenuScene.Visible = True
' per selezione punti
ElseIf m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Or m_nStatus = ST.SELPOINT Then
' se drag abilitato
If m_bDragOn Then
For Each i As ToolStripItem In MenuScene.Items
Select Case i.Name
Case "cmdSketchPoint"
i.Text = EgtMsg(1101) ' Sketch Point
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_SKETCH)
Case "cmdGridPoint"
i.Text = EgtMsg(1103) ' Grid Point
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_GRID)
Case "cmdEndPoint"
i.Text = EgtMsg(1105) ' End Point
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_END)
Case "cmdMidPoint"
i.Text = EgtMsg(1107) ' Mid Point
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_MID)
Case "cmdCenterPoint"
i.Text = EgtMsg(1109) ' Center Point
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.CENTER)
Case "cmdCentroid"
i.Text = EgtMsg(1111) ' Centroid
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.CENTROID)
Case "cmdNearPoint"
i.Text = EgtMsg(1113) ' Near Point
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_NEAR)
Case "cmdIntersectionPoint"
i.Text = EgtMsg(1115) ' Intersection Point
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_INTERS)
Case "cmdTangentPoint"
i.Text = EgtMsg(1117) ' Tangent Point
If m_bTangentPointOn Then
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_TANGENT)
Else
i.Visible = False
End If
Case "cmdPerpendicularPoint"
i.Text = EgtMsg(1119) ' Perpendicular Point
If m_bPerpendicularPointOn Then
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_PERPENDICULAR)
Else
i.Visible = False
End If
Case "cmdMinDistPoint"
i.Text = EgtMsg(1121) ' Min Dist Point
If m_bMinDistPointOn Then
i.Visible = True
DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_MINDIST)
Else
i.Visible = False
End If
Case "sepSelPnt1"
i.Visible = (m_nStatus <> ST.GETDIST And m_nStatus <> ST.GETDIST2)
Case "cmdStopDrag"
i.Text = EgtMsg(1201) ' Drag Off
i.Visible = (m_nStatus <> ST.GETDIST And m_nStatus <> ST.GETDIST2)
Case Else
i.Visible = False
End Select
Next
' altrimenti con drag disabilitato
Else
For Each i As ToolStripItem In MenuScene.Items
If i.Name = "cmdRestartDrag" Then
i.Text = EgtMsg(1203) ' Drag On
i.Visible = True
Else
i.Visible = False
End If
Next
End If
MenuScene.Visible = True
' altri casi
Else
MenuScene.Visible = False
End If
End Sub
Private Sub MenuScene_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles MenuScene.ItemClicked
' Per selezione
If e.ClickedItem.Name = "cmdSelectAll" Then
RaiseEvent OnMouseSelectedAll(Me)
ElseIf e.ClickedItem.Name = "cmdDeselectAll" Then
RaiseEvent OnMouseDeselectedAll(Me)
ElseIf e.ClickedItem.Name = "cmdWinSelect" Then
m_nStatus = ST.WINSEL
ElseIf e.ClickedItem.Name = "cmdSelectPart" Then
m_nStatus = ST.SELPART
ElseIf e.ClickedItem.Name = "cmdSelectLayer" Then
m_nStatus = ST.SELLAYER
' Riabilitazione drag sospeso
ElseIf e.ClickedItem.Name = "cmdRestartDrag" Then
EgtResetGeoLine()
EgtResetGeoTria()
m_bDragOn = True
' Scelta tipo punto snap
ElseIf e.ClickedItem.Name = "cmdSketchPoint" Then
m_nSnapType = SP.PT_SKETCH
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdGridPoint" Then
m_nSnapType = SP.PT_GRID
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdEndPoint" Then
m_nSnapType = SP.PT_END
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdMidPoint" Then
m_nSnapType = SP.PT_MID
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdCenterPoint" Then
m_nSnapType = SP.CENTER
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdCentroid" Then
m_nSnapType = SP.CENTROID
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdNearPoint" Then
m_nSnapType = SP.PT_NEAR
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdIntersectionPoint" Then
m_nSnapType = SP.PT_INTERS
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdTangentPoint" Then
m_nSnapType = SP.PT_TANGENT
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdPerpendicularPoint" Then
m_nSnapType = SP.PT_PERPENDICULAR
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
ElseIf e.ClickedItem.Name = "cmdMinDistPoint" Then
m_nSnapType = SP.PT_MINDIST
RaiseEvent OnChangedSnapPointType(Me, m_nSnapType)
' Sospensione drag
ElseIf e.ClickedItem.Name = "cmdStopDrag" Then
m_bDragOn = False
End If
End Sub
'---- Status management -------------
Private Function IsRestorableCurrStatus() As Boolean
Select Case m_nStatus
Case ST.NULL, ST.SEL, ST.ANALYZE, ST.SELPART, ST.SELLAYER, ST.GETDIST, ST.GETDIST2, ST.SELPOINT, ST.SELPOINTZ
Return True
Case Else
Return False
End Select
End Function
Private Sub SaveCurrStatus()
If IsRestorableCurrStatus() Then
m_nOldStatus = m_nStatus
End If
End Sub
Private Function RestoreStatus() As Boolean
' eventuale ripristino vecchio stato
If m_nOldStatus = ST.NULL Then
m_nStatus = m_nOldStatus
Cursor = Cursors.Default
Return True
ElseIf m_nOldStatus = ST.SEL Or m_nOldStatus = ST.SELPART Or m_nOldStatus = ST.SELLAYER Then
m_nStatus = m_nOldStatus
Cursor = New Cursor(Me.GetType(), "Select.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 Or m_nOldStatus = ST.SELPOINTZ Then
m_nStatus = m_nOldStatus
Cursor = New Cursor(Me.GetType(), "SelPoint.cur")
Return True
End If
Return False
End Function
Public Sub SetStatusNull()
m_nStatus = ST.NULL
End Sub
Public Sub SetStatusAnalyze()
m_nStatus = ST.ANALYZE
End Sub
Public Sub SetStatusGetDistance()
m_nStatus = ST.GETDIST
End Sub
Public Sub SetStatusSelPoint(Optional ByVal bAlsoDir As Boolean = False)
m_nStatus = ST.SELPOINT
m_bAlsoSelDir = bAlsoDir
End Sub
Public Sub ResetStatus(Optional ByVal bRedraw As Boolean = True)
' pulisco eventuali geometrie temporanee
EraseDragGroup()
EgtResetGeoLine(False)
EgtResetGeoTria(False)
EgtResetWinRect(False)
' reset entità non selezionabili
EgtUnselectableClearAll()
' imposto lo stato
m_nStatus = ST.SEL
m_nOldStatus = ST.SEL
' disabilito scelta punto tangente, perpendicolare e minima distanza
DisableTangentPoint()
DisablePerpendicularPoint()
DisableMinDistPoint()
' abilito drag
m_bDragOn = True
' aggiorno visualizzazione
If bRedraw Then
EgtDraw()
End If
End Sub
Public Sub ResetStatusAnalyze()
If m_nStatus = ST.ANALYZE Then
m_nStatus = ST.SEL
m_nOldStatus = ST.SEL
End If
End Sub
Public Sub ResetStatusGetDistance()
If m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Then
m_nStatus = ST.SEL
m_nOldStatus = ST.SEL
End If
EgtResetGeoLine()
RaiseEvent OnCloseGetDist(Me)
End Sub
Public Function GetSnapPointType() As SP
If m_nStatus <> ST.SELPOINT And m_nStatus <> ST.SELPOINTZ Then
Return SP.PT_NONE
Else
Return m_nSnapType
End If
End Function
'---- Drag Group ------
Private m_bDragOn As Boolean = True
Private m_bDragSelectable As Boolean = False
Private m_nDragGroup As Integer = GDB_ID.NULL
Public Sub EnableDrag()
m_bDragOn = True
End Sub
Public Sub DisableDrag()
m_bDragOn = False
End Sub
Public Function GetDragStatus() As Boolean
Return m_bDragOn
End Function
Public Function CreateDragGroup(Optional bSelectable As Boolean = False) As Boolean
' le azioni successive sono temporanee -> non devono cambiare lo stato di modifica del progetto
EgtDisableModified()
' creo il gruppo di drag
m_nDragGroup = EgtCreateGroup(GDB_ID.ROOT)
Dim bOk As Boolean = (m_nDragGroup <> GDB_ID.NULL)
If bOk Then
EgtSetLevel(m_nDragGroup, GDB_LV.TEMP)
EgtSetMark(m_nDragGroup)
m_bDragSelectable = bSelectable
If m_bDragSelectable Then
EgtUnselectableRemove(m_nDragGroup)
Else
EgtUnselectableAdd(m_nDragGroup)
End If
End If
' riabilito possibilità modifica stato progetto
EgtEnableModified()
Return bOk
End Function
Public Function EraseDragGroup() As Boolean
' le azioni successive sono temporanee -> non devono cambiare lo stato di modifica del progetto
EgtDisableModified()
' cancello il gruppo di drag
EgtErase(m_nDragGroup)
m_bDragSelectable = False
EgtUnselectableRemove(m_nDragGroup)
m_nDragGroup = GDB_ID.NULL
' riabilito possibilità modifica stato progetto
EgtEnableModified()
Return True
End Function
Public Function AddToDragGroup(ByVal nId As Integer) As Boolean
' le azioni successive sono temporanee -> non devono cambiare lo stato di modifica del progetto
EgtDisableModified()
' copio entità
Dim nNewId As Integer = EgtCopyGlob(nId, m_nDragGroup, GDB_POS.SON)
Dim bOk As Boolean = (nNewId <> GDB_ID.NULL)
If bOk Then
' assegno il colore (potrebbe essere da layer, quindi va fatto)
Dim ColObj As Color3d
EgtGetCalcColor(nId, ColObj)
EgtSetColor(nNewId, ColObj)
' assegno Id entità origine
EgtSetInfo(nNewId, "Id", nId.ToString())
End If
' riabilito possibilità modifica stato progetto
EgtEnableModified()
Return bOk
End Function
Public Function GetDragGroup() As Integer
Return m_nDragGroup
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 BottomView()
EgtSetView(VT.BOTTOM)
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
Public Sub CPlaneView()
EgtSetView(VT.CPLANE)
End Sub
End Class