Files
TestEIn/Controller.vb
T
Dario Sassi 6a3cec0037 TestEIn 1.5j7 :
- nuova gestione con Controller
- aggiunti comandi di disegno.
2014-11-05 17:35:26 +00:00

941 lines
32 KiB
VB.net

'----------------------------------------------------------------------------
' EgalTech 2014-2014
'----------------------------------------------------------------------------
' File : Controller.vb Data : 04.11.14 Versione : 1.5k1
' Contenuto : Classe Controller (parte di MCV).
'
'
'
' Modifiche : 04.11.14 DS Creazione modulo.
'
'
'----------------------------------------------------------------------------
Imports Microsoft.VisualBasic
Imports System.Globalization
Imports TestEIn.EgtInterface
Public Class Controller
' Events
Public Enum IBT As Integer
TY_NULL = 0
TY_DOUBLE
TY_POINT3D
End Enum
Public Event SetInputBox(ByVal sTitle As String, ByVal sLabel As String, ByVal nType As IBT)
Public Event UpdateUI(ByVal sender As Object)
' Documento e vista
Private m_Scene As Scene
' Stato e comandi
Public Enum CMD As Integer
NULL = 0
NEWPART
NEWLAYER
SETCURRPARTLAYER
RESETCURRPARTLAYER
DELETEPARTLAYER
LAYERCOLOR
POINT
LINE2P
ARCCSE
ARC3P
CIRCLECR
PLANE
EXTRUDE
REVOLVE
DELETE
CHANGECOLOR
RESETCOLOR
INVERTCRVSURF
JOINCURVE
SPLITCURVE
MOVE
COPY
ROTATE
ROTATE3D
MIRROR
End Enum
Private m_nLastCmd As CMD = CMD.NULL
Private Enum EST As Integer
NULL = 0
POINT_1
LINE2P_1
LINE2P_2
CIRCLECR_1
CIRCLECR_2
ARCCSE_1
ARCCSE_2
ARCCSE_3
ARC3P_1
ARC3P_2
ARC3P_3
EXTRUDE_1
REVOLVE_1
REVOLVE_2
MOVE_1
MOVE_2
COPY_1
COPY_2
ROTATE_1
ROTATE_2
ROTATE_3
ROTATE3D_1
ROTATE3D_2
ROTATE3D_3
MIRROR_1
MIRROR_2
End Enum
Private m_nStatus As EST = EST.NULL
Private m_ptP1 As Point3d
Private m_ptP2 As Point3d
Private m_ptLast As Point3d
Private m_dLast As Double = 0
Private m_nLast1 As Integer = 0
Private m_nLast2 As Integer = 0
' Metodi
Public Sub SetScene(ByRef scene As Scene)
m_Scene = scene
End Sub
Public Sub SetLastPoint3d(ByRef ptP As Point3d)
m_ptLast = ptP
End Sub
Public Sub SetLastDouble(ByVal dVal As Double)
m_dLast = dVal
End Sub
Public Sub SetLastIntegers(ByVal nVal1 As Integer, ByVal nVal2 As Integer)
m_nLast1 = nVal1
m_nLast2 = nVal2
End Sub
Private Function GetDoubleFromString(ByRef sText As String, ByRef dVal As Double) As Boolean
Return Double.TryParse(sText, NumberStyles.Float, CultureInfo.InvariantCulture, dVal)
End Function
Private Function GetPoint3dFromString(ByRef sText As String, ByRef PtVal As Point3d) As Boolean
Dim sItems() As String = sText.Split(",".ToCharArray)
Dim bOk As Boolean = False
PtVal = Point3d.ORIG
If sItems.Count() >= 1 Then
bOk = Double.TryParse(sItems(0), NumberStyles.Float, CultureInfo.InvariantCulture, PtVal.x)
If sItems.Count() >= 2 Then
bOk = Double.TryParse(sItems(1), NumberStyles.Float, CultureInfo.InvariantCulture, PtVal.y) And bOk
If sItems.Count() >= 3 Then
bOk = Double.TryParse(sItems(2), NumberStyles.Float, CultureInfo.InvariantCulture, PtVal.z) And bOk
End If
End If
End If
Return bOk
End Function
Public Sub ResetStatus()
m_nStatus = EST.NULL
m_Scene.ResetStatus()
End Sub
Public Function RepeatLastCommand() As Boolean
Return ExecuteCommand(m_nLastCmd)
End Function
Public Function ExecuteCommand(ByVal nCmd As CMD) As Boolean
' posso partire solo con stato libero
If m_nStatus <> EST.NULL Then
Return False
End If
' eseguo il comando
Select Case nCmd
Case CMD.NEWPART
' inserisco un nuovo gruppo (piece) sotto la radice
Dim nIdNewPart As Integer = EgtCreateGroup(GDB_ID.ROOT)
' inserisco un nuovo gruppo (layer) sotto quello appena creato
Dim nIdNewLayer As Integer = EgtCreateGroup(nIdNewPart)
' se ok, salvo nuova situazione
If nIdNewPart <> GDB_ID.NULL And nIdNewLayer <> GDB_ID.NULL Then
m_nCurrPart = nIdNewPart
m_nCurrLayer = nIdNewLayer
SetModified()
End If
Case CMD.NEWLAYER
' inserisco un nuovo gruppo (layer) sotto il pezzo corrente
Dim nIdNewLayer As Integer = EgtCreateGroup(m_nCurrPart)
' se ok, salvo nuova situazione
If nIdNewLayer <> GDB_ID.NULL Then
m_nCurrLayer = nIdNewLayer
SetModified()
End If
Case CMD.SETCURRPARTLAYER
SetCurrPartLayer(m_nLast1, m_nLast2)
Case CMD.RESETCURRPARTLAYER
ResetCurrPartLayer()
Case CMD.DELETEPARTLAYER
If m_nLast1 <> GDB_ID.NULL Then
EgtErase(m_nLast1)
If m_nLast1 = m_nCurrPart Then
ResetCurrPartLayer()
ElseIf m_nLast1 = m_nCurrLayer Then
SetCurrPartLayer(m_nCurrPart, EgtGetFirstGroupInGroup(m_nCurrPart))
End If
SetModified()
End If
Case CMD.LAYERCOLOR
Dim nCurrId As Integer
If m_nCurrPart <> GDB_ID.NULL Then
nCurrId = m_nCurrPart
If m_nCurrLayer <> GDB_ID.NULL Then
nCurrId = m_nCurrLayer
End If
Else
Return False
End If
Dim ColDlg As New ColorDialog
ColDlg.AnyColor = True
Dim colObj As Color3d
EgtGetCalcColor(nCurrId, colObj)
ColDlg.Color = colObj.ToColor()
ColDlg.FullOpen = True
If ColDlg.ShowDialog() = Windows.Forms.DialogResult.OK Then
colObj.FromColor(ColDlg.Color)
EgtSetColor(nCurrId, colObj)
SetModified()
EgtDraw()
End If
Case CMD.POINT
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' non serve il gruppo di drag
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per point
m_nStatus = EST.POINT_1
' abilito dialogo
RaiseEvent SetInputBox("POINT", "Insert Point ", IBT.TY_POINT3D)
Case CMD.LINE2P
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' creo il gruppo di drag
If Not m_Scene.CreateDragGroup() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Line2P
m_nStatus = EST.LINE2P_1
' abilito dialogo
RaiseEvent SetInputBox("LINE", "Insert Start Point ", IBT.TY_POINT3D)
Case CMD.CIRCLECR
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' creo il gruppo di drag
If Not m_Scene.CreateDragGroup() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per CircleCR
m_nStatus = EST.CIRCLECR_1
' abilito dialogo
RaiseEvent SetInputBox("CIRCLE", "Insert Center", IBT.TY_POINT3D)
Case CMD.ARCCSE
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' creo il gruppo di drag
If Not m_Scene.CreateDragGroup() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per ArcCSE
m_nStatus = EST.ARCCSE_1
' abilito dialogo
RaiseEvent SetInputBox("ARC", "Insert Center", IBT.TY_POINT3D)
Case CMD.ARC3P
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' creo il gruppo di drag
If Not m_Scene.CreateDragGroup() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Arc3P
m_nStatus = EST.ARC3P_1
' abilito dialogo
RaiseEvent SetInputBox("ARC", "Insert Start Point", IBT.TY_POINT3D)
Case CMD.PLANE
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' creo la superficie piana (a partire da un contorno selezionato)
EgtCreateSurfTriMeshByContour(GetCurrLayer(), EgtGetFirstSelectedObj(), EPS_STM)
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case CMD.EXTRUDE
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' creo il gruppo di drag
If Not m_Scene.CreateDragGroup() Then
Return False
End If
' imposto stato a lunghezza di estrusione
m_nStatus = EST.EXTRUDE_1
' abilito dialogo
RaiseEvent SetInputBox("EXTRUSION", "Insert length", IBT.TY_DOUBLE)
Case CMD.REVOLVE
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Revolve
m_nStatus = EST.REVOLVE_1
' abilito dialogo
RaiseEvent SetInputBox("REVOLVE", "Insert First Point on Axis", IBT.TY_POINT3D)
Case CMD.DELETE
' lancio la cancellazione
EgtErase(GDB_ID.SEL)
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case CMD.CHANGECOLOR
' verifico ci sia qualcosa di selezionato
Dim nId As Integer = EgtGetFirstSelectedObj()
If nId = GDB_ID.NULL Then
Return False
End If
' lancio dialogo scelta colore
Dim ColDlg As New ColorDialog()
ColDlg.AnyColor = True
Dim colObj As Color3d
EgtGetCalcColor(nId, colObj)
ColDlg.Color = colObj.ToColor()
ColDlg.FullOpen = True
If ColDlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
Return False
End If
' assegno nuovo colore
colObj.FromColor(ColDlg.Color)
EgtSetColor(GDB_ID.SEL, colObj)
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case CMD.RESETCOLOR
' verifico ci sia qualcosa di selezionato
Dim nId As Integer = EgtGetFirstSelectedObj()
If nId = GDB_ID.NULL Then
Return False
End If
' reset colore
EgtResetColor(GDB_ID.SEL)
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case CMD.INVERTCRVSURF
' lancio l'inversione delle curve/superfici
Dim nId As Integer = EgtGetFirstSelectedObj()
While nId <> GDB_ID.NULL
Select Case EgtGetType(nId)
Case TY.CRV_LINE, TY.CRV_ARC, TY.CRV_BEZ, TY.CRV_COMPO
EgtInvertCurve(nId)
Case TY.SRF_MESH
EgtInvertSurface(nId)
End Select
nId = EgtGetNextSelectedObj()
End While
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case CMD.JOINCURVE
' posso partire solo se esiste un gruppo corrente
If GetCurrLayer() = GDB_ID.NULL Then
Return False
End If
' creo vettore di entità selezionate
Dim nCrvNum As Integer = 0
Dim nCrvIds(EgtGetSelectedObjNbr() - 1) As Integer
Dim nId As Integer = EgtGetFirstSelectedObj()
While nId <> GDB_ID.NULL
nCrvIds(nCrvNum) = nId
nCrvNum = nCrvNum + 1
nId = EgtGetNextSelectedObj()
End While
' creo la curva composita (concatenando le curve selezionate)
EgtCreateCurveCompoByChain(GetCurrLayer(), nCrvNum, nCrvIds, New Point3d, True)
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case CMD.SPLITCURVE
' divido la curva composita nelle curve componenti
EgtSplitCurveCompo(EgtGetFirstSelectedObj())
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case CMD.MOVE
' verifico condizioni e preparo per il drag
If Not PrepareTransform() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Move
m_nStatus = EST.MOVE_1
' abilito dialogo
RaiseEvent SetInputBox("MOVE", "Insert Base Point", IBT.TY_POINT3D)
Case CMD.COPY
' verifico condizioni e preparo per il drag
If Not PrepareTransform() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Move
m_nStatus = EST.COPY_1
' abilito dialogo
RaiseEvent SetInputBox("COPY", "Insert Base Point", IBT.TY_POINT3D)
Case CMD.ROTATE
' verifico condizioni e preparo per il drag
If Not PrepareTransform() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Rotate
m_nStatus = EST.ROTATE_1
' abilito dialogo
RaiseEvent SetInputBox("ROTATE", "Insert Center", IBT.TY_POINT3D)
Case CMD.ROTATE3D
' verifico condizioni e preparo per il drag
If Not PrepareTransform() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Rotate3d
m_nStatus = EST.ROTATE3D_1
' abilito dialogo
RaiseEvent SetInputBox("ROTATE3D", "Insert First Point on Axis", IBT.TY_POINT3D)
Case CMD.MIRROR
' verifico condizioni e preparo per il drag
If Not PrepareTransform() Then
Return False
End If
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per Mirror
m_nStatus = EST.MIRROR_1
' abilito dialogo
RaiseEvent SetInputBox("MIRROR", "Insert Start Point", IBT.TY_POINT3D)
Case Else
m_nLastCmd = CMD.NULL
Return False
End Select
' salvo l'ultimo comando
m_nLastCmd = nCmd
Return True
End Function
Private Function PrepareTransform() As Boolean
' posso partire solo da stato libero
If m_nStatus <> EST.NULL Then
Return False
End If
' verifico ci sia qualcosa di selezionato
If EgtGetFirstSelectedObj() = GDB_ID.NULL Then
Return False
End If
' creo il gruppo di drag e vi copio le entità selezionate
If Not m_Scene.CreateDragGroup() Then
Return False
End If
Dim nId As Integer = EgtGetFirstSelectedObj()
While nId <> GDB_ID.NULL
If Not m_Scene.AddToDragGroup(nId) Then
m_Scene.EraseDragGroup()
Return False
End If
nId = EgtGetNextSelectedObj()
End While
Return True
End Function
Public Function GoToNextStatus() As Boolean
Select Case m_nStatus
' Point
Case EST.POINT_1
' creo il punto (i dati sono in globale)
EgtCreateGeoPoint(GetCurrLayer(), m_ptLast.Loc(GetCurrLayer()))
' reset stato scena
m_Scene.ResetStatus()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Line2P
Case EST.LINE2P_1
m_ptP1 = m_ptLast
m_nStatus = EST.LINE2P_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("LINE", "Insert End Point ", IBT.TY_POINT3D)
Case EST.LINE2P_2
' reset scena
m_Scene.ResetStatus(False)
' creo la linea (i punti sono in globale)
EgtCreateCurveLine(GetCurrLayer(), m_ptP1.Loc(GetCurrLayer()), m_ptLast.Loc(GetCurrLayer()))
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' CircleCR
Case EST.CIRCLECR_1
m_ptP1 = m_ptLast
m_nStatus = EST.CIRCLECR_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("CIRCLE", "Insert Point", IBT.TY_POINT3D)
Case EST.CIRCLECR_2
' reset scena
m_Scene.ResetStatus(False)
' creo la circonferenza (i punti sono in globale)
EgtCreateCurveCircleCPN(GetCurrLayer(), m_ptP1.Loc(GetCurrLayer()), m_ptLast.Loc(GetCurrLayer()), EgtGetGridVersZ())
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' ArcCSE
Case EST.ARCCSE_1
m_ptP1 = m_ptLast
m_nStatus = EST.ARCCSE_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("ARC", "Insert Start Point", IBT.TY_POINT3D)
Case EST.ARCCSE_2
m_ptP2 = m_ptLast
m_nStatus = EST.ARCCSE_3
m_Scene.EnableDrag()
RaiseEvent SetInputBox("ARC", "Insert Point Near End", IBT.TY_POINT3D)
Case EST.ARCCSE_3
' reset scena
m_Scene.ResetStatus(False)
' creo l'arco (i punti sono in globale)
EgtCreateCurveArcC2PN(GetCurrLayer(), m_ptP1.Loc(GetCurrLayer()), m_ptP2.Loc(GetCurrLayer()), m_ptLast.Loc(GetCurrLayer()), EgtGetGridVersZ())
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Arc3P
Case EST.ARC3P_1
m_ptP1 = m_ptLast
m_nStatus = EST.ARC3P_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("ARC", "Insert End Point", IBT.TY_POINT3D)
Case EST.ARC3P_2
m_ptP2 = m_ptLast
m_nStatus = EST.ARC3P_3
m_Scene.EnableDrag()
RaiseEvent SetInputBox("ARC", "Insert Mid Point", IBT.TY_POINT3D)
Case EST.ARC3P_3
' reset scena
m_Scene.ResetStatus(False)
' creo l'arco (i punti sono in globale)
EgtCreateCurveArc3P(GetCurrLayer(), m_ptP1.Loc(GetCurrLayer()), m_ptLast.Loc(GetCurrLayer()), m_ptP2.Loc(GetCurrLayer()))
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Extrude
Case EST.EXTRUDE_1
' reset scena
m_Scene.ResetStatus(False)
' creo la superficie di estrusione (a partire da un contorno selezionato)
Dim VtExtr As New Vector3d(0, 0, m_dLast)
EgtCreateSurfTriMeshByExtrusion(GetCurrLayer(), EgtGetFirstSelectedObj(), VtExtr, EPS_STM)
EgtDeselectAll()
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Revolve
Case EST.REVOLVE_1
m_ptP1 = m_ptLast
m_nStatus = EST.REVOLVE_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("REVOLVE", "Insert Second Point on Axis", IBT.TY_POINT3D)
Case EST.REVOLVE_2
' reset scena
m_Scene.ResetStatus(False)
' creo la superficie di rivoluzione (i punti sono in globale)
Dim vtAx As Vector3d = m_ptLast - m_ptP1
EgtCreateSurfTriMeshByScrewing(GetCurrLayer(), EgtGetFirstSelectedObj(),
m_ptP1.Loc(GetCurrLayer()), vtAx.Loc(GetCurrLayer()),
360, 0, EPS_STM)
EgtDeselectAll()
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Move
Case EST.MOVE_1
m_ptP1 = m_ptLast
m_nStatus = EST.MOVE_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("MOVE", "Insert Target Point", IBT.TY_POINT3D)
Case EST.MOVE_2
' eseguo movimento
EgtMoveGlob(GDB_ID.SEL, (m_ptLast - m_ptP1))
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Copy
Case EST.COPY_1
m_ptP1 = m_ptLast
m_nStatus = EST.COPY_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("COPY", "Insert Target Point", IBT.TY_POINT3D)
Case EST.COPY_2
' reset scena
m_Scene.ResetStatus(False)
' eseguo copia e movimento
Dim nId As Integer = EgtGetFirstSelectedObj()
While nId <> GDB_ID.NULL
Dim nCopyId As Integer = EgtCopyGlob(nId, GetCurrLayer())
EgtMoveGlob(nCopyId, (m_ptLast - m_ptP1))
nId = EgtGetNextSelectedObj()
End While
EgtDeselectAll()
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Rotate
Case EST.ROTATE_1
m_ptP1 = m_ptLast
m_nStatus = EST.ROTATE_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("ROTATE", "Insert Base Point", IBT.TY_POINT3D)
Case EST.ROTATE_2
m_ptP2 = m_ptLast
m_nStatus = EST.ROTATE_3
m_Scene.EnableDrag()
RaiseEvent SetInputBox("ROTATE", "Insert Rotation Point", IBT.TY_POINT3D)
Case EST.ROTATE_3
' eseguo rotazione
Dim dAngRotDeg As Double = 0
Dim bDet As Boolean = True
EgtGetVectorRotation((m_ptP2 - m_ptP1), (m_ptLast - m_ptP1), EgtGetGridVersZ(), dAngRotDeg, bDet)
EgtRotateGlob(GDB_ID.SEL, m_ptP1, EgtGetGridVersZ(), dAngRotDeg)
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Rotate3d
Case EST.ROTATE3D_1
m_ptP1 = m_ptLast
m_ptP2 = m_ptP1
m_nStatus = EST.ROTATE3D_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("ROTATE3D", "Insert Second Point on Axis", IBT.TY_POINT3D)
Case EST.ROTATE3D_2
m_ptP2 = m_ptLast
m_nStatus = EST.ROTATE3D_3
' abilito dialogo
RaiseEvent SetInputBox("ROTATE3D", "Insert angle", IBT.TY_DOUBLE)
Case EST.ROTATE3D_3
' eseguo rotazione
Dim VtAx As Vector3d = m_ptP2 - m_ptP1
EgtRotateGlob(GDB_ID.SEL, m_ptP1, VtAx, m_dLast)
EgtDeselectAll()
' reset
m_Scene.ResetStatus()
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
' Mirror
Case EST.MIRROR_1
m_ptP1 = m_ptLast
m_ptP2 = m_ptP1
m_nStatus = EST.MIRROR_2
m_Scene.EnableDrag()
RaiseEvent SetInputBox("MIRROR", "Insert End Point", IBT.TY_POINT3D)
Case EST.MIRROR_2
' eseguo mirror
Dim VtNorm As Vector3d = (m_ptLast - m_ptP1) ^ EgtGetGridVersZ()
If VtNorm.Len > EPS_SMALL Then
EgtMirrorGlob(GDB_ID.SEL, m_ptP1, VtNorm)
End If
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
RaiseEvent UpdateUI(Me)
Case Else
Return False
End Select
Return True
End Function
Public Function ExecuteDrag() As Boolean
Select Case m_nStatus
Case EST.LINE2P_2
' durante la creazione di oggetti il gruppo di Drag ha riferimento globale
Dim nId As Integer = EgtGetFirstInGroup(m_Scene.GetDragGroup())
If nId = GDB_ID.NULL Then
EgtCreateCurveLine(m_Scene.GetDragGroup(), m_ptP1, m_ptLast)
Else
EgtModifyCurveEndPoint(nId, m_ptLast)
End If
EgtDraw()
Case EST.CIRCLECR_2
' durante la creazione di oggetti il gruppo di Drag ha riferimento globale
' durante la creazione di oggetti il gruppo di Drag ha riferimento globale
Dim nId As Integer = EgtGetFirstInGroup(m_Scene.GetDragGroup())
If nId = GDB_ID.NULL Then
EgtCreateCurveCircleCPN(m_Scene.GetDragGroup(), m_ptP1, m_ptLast, EgtGetGridVersZ())
Else
EgtModifyCurveCircleCPN(nId, m_ptLast)
End If
EgtDraw()
Case EST.ARCCSE_2, EST.ARC3P_2
' durante la creazione di oggetti il gruppo di Drag ha riferimento globale
Dim nId As Integer = EgtGetFirstInGroup(m_Scene.GetDragGroup())
If nId = GDB_ID.NULL Then
EgtCreateCurveLine(m_Scene.GetDragGroup(), m_ptP1, m_ptLast)
Else
EgtModifyCurveEndPoint(nId, m_ptLast)
End If
EgtDraw()
Case EST.ARCCSE_3
' durante la creazione di oggetti il gruppo di Drag ha riferimento globale
Dim nId As Integer = EgtGetFirstInGroup(m_Scene.GetDragGroup())
If EgtGetType(nId) <> TY.CRV_ARC Then
EgtErase(nId)
nId = GDB_ID.NULL
End If
If nId = GDB_ID.NULL Then
EgtCreateCurveArcC2PN(m_Scene.GetDragGroup(), m_ptP1, m_ptP2, m_ptLast, EgtGetGridVersZ())
Else
EgtModifyCurveArcC2PN(nId, m_ptLast)
End If
EgtDraw()
Case EST.ARC3P_3
' durante la creazione di oggetti il gruppo di Drag ha riferimento globale
Dim nId As Integer = EgtGetFirstInGroup(m_Scene.GetDragGroup())
If EgtGetType(nId) <> TY.CRV_ARC Then
EgtErase(nId)
nId = GDB_ID.NULL
End If
If nId = GDB_ID.NULL Then
EgtCreateCurveArc3P(m_Scene.GetDragGroup(), m_ptP1, m_ptLast, m_ptP2)
Else
EgtModifyCurveArc3P(nId, m_ptLast)
End If
EgtDraw()
Case EST.EXTRUDE_1
' cancello eventuale vecchia superficie di estrusione
EgtErase(EgtGetFirstInGroup(m_Scene.GetDragGroup()))
' creo la superficie di estrusione (a partire da un contorno selezionato)
Dim VtExtr As New Vector3d(0, 0, m_dLast)
EgtCreateSurfTriMeshByExtrusion(m_Scene.GetDragGroup(), EgtGetFirstSelectedObj(), VtExtr, EPS_STM)
EgtDraw()
Case EST.REVOLVE_2
EgtSetGeoLine(m_ptP1, m_ptLast)
EgtDraw()
Case EST.MOVE_2
' ripristino lo stato iniziale
EgtChangeGroupFrame(m_Scene.GetDragGroup(), Frame3d.GLOB)
' eseguo tutto il movimento
EgtMoveGlob(m_Scene.GetDragGroup(), (m_ptLast - m_ptP1))
EgtSetGeoLine(m_ptP1, m_ptLast)
EgtDraw()
Case EST.COPY_2
' ripristino lo stato iniziale
EgtChangeGroupFrame(m_Scene.GetDragGroup(), Frame3d.GLOB)
' eseguo tutto il movimento
EgtMoveGlob(m_Scene.GetDragGroup(), (m_ptLast - m_ptP1))
EgtSetGeoLine(m_ptP1, m_ptLast)
EgtDraw()
Case EST.ROTATE_3
' ripristino lo stato iniziale
EgtChangeGroupFrame(m_Scene.GetDragGroup(), Frame3d.GLOB)
' eseguo rotazione
Dim dAngRotDeg As Double = 0
Dim bDet As Boolean = True
EgtGetVectorRotation((m_ptP2 - m_ptP1), (m_ptLast - m_ptP1), EgtGetGridVersZ(), dAngRotDeg, bDet)
EgtRotateGlob(m_Scene.GetDragGroup(), m_ptP1, EgtGetGridVersZ(), dAngRotDeg)
EgtDraw()
Case EST.ROTATE3D_2
EgtSetGeoLine(m_ptP1, m_ptLast)
EgtDraw()
Case EST.ROTATE3D_3
' ripristino lo stato iniziale
EgtChangeGroupFrame(m_Scene.GetDragGroup(), Frame3d.GLOB)
' eseguo rotazione
Dim VtAx As Vector3d = m_ptP2 - m_ptP1
EgtRotateGlob(m_Scene.GetDragGroup(), m_ptP1, VtAx, m_dLast)
EgtDraw()
Case EST.MIRROR_2
' ripristino lo stato iniziale, tramite annullo mirror precedente
Dim VtNorm As Vector3d = (m_ptP2 - m_ptP1) ^ EgtGetGridVersZ()
If VtNorm.Len > EPS_SMALL Then
EgtMirrorGlob(m_Scene.GetDragGroup(), m_ptP1, VtNorm)
End If
' eseguo mirror
VtNorm = (m_ptLast - m_ptP1) ^ EgtGetGridVersZ()
If VtNorm.Len > EPS_SMALL Then
EgtMirrorGlob(m_Scene.GetDragGroup(), m_ptP1, VtNorm)
End If
' salvo il punto
m_ptP2 = m_ptLast
EgtDraw()
Case Else
Return False
End Select
Return True
End Function
'-------------------------------- Currente Part and Layer ----------------------------------------
Private m_nCurrPart = GDB_ID.NULL
Private m_nCurrLayer = GDB_ID.NULL
Public Function GetCurrPart() As Integer
Return m_nCurrPart
End Function
Public Function GetCurrLayer() As Integer
Return m_nCurrLayer
End Function
Private Function SetCurrPartLayer(ByVal nPart As Integer, ByVal nLayer As Integer) As Boolean
' verifico esistenza
If Not EgtExistsObj(nPart) Or EgtGetParent(nLayer) <> nPart Then
Return False
End If
' assegno
m_nCurrPart = nPart
m_nCurrLayer = nLayer
Return True
End Function
Private Function ResetCurrPartLayer() As Boolean
' reset
m_nCurrPart = GDB_ID.NULL
m_nCurrLayer = GDB_ID.NULL
' cerco il primo pezzo
Dim nIdPart As Integer = EgtGetFirstGroupInGroup(GDB_ID.ROOT)
If nIdPart <> GDB_ID.NULL Then
' assegno il pezzo corrente
m_nCurrPart = nIdPart
' cerco il primo layer del pezzo
Dim nIdLayer As Integer = EgtGetFirstGroupInGroup(m_nCurrPart)
If nIdLayer <> GDB_ID.NULL Then
' assegno il layer corrente
m_nCurrLayer = nIdLayer
End If
End If
Return True
End Function
'-------------------------------- Modified Status ------------------------------------------------
Private m_sCurrFile As String = String.Empty
Private m_bModified As Boolean = False
Public Sub SetCurrFile(ByRef sFile As String)
m_sCurrFile = sFile
End Sub
Public Sub ResetCurrFile()
m_sCurrFile = String.Empty
End Sub
Public Function GetCurrFile() As String
Return m_sCurrFile
End Function
Public Sub SetModified()
m_bModified = True
End Sub
Public Sub ResetModified()
m_bModified = False
End Sub
Public Function GetModified() As Boolean
Return m_bModified
End Function
Public Function ManageModified() As Boolean
' se non modificato, procedo normalmente
If Not m_bModified Then
Return True
End If
' chiedo cosa fare
Dim sMsg As String = "Salvare le modifiche"
If Not String.IsNullOrEmpty(m_sCurrFile) Then
sMsg += " a " + m_sCurrFile
End If
sMsg += " ?"
Dim nRes = MessageBox.Show(sMsg, "", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
Select Case nRes
Case Windows.Forms.DialogResult.Yes
m_Scene.SaveProject(m_sCurrFile)
Return True
Case Windows.Forms.DialogResult.No
Return True
Case Else
Return False
End Select
End Function
End Class