Files
TestEIn/Controller.vb
T
Dario Sassi 6c01a2f821 TestEIN 1.5k1 :
- gestione Cplane/Grid
- gestione visualizza/nascondi
- aggiunta spezza entità sul punto.
2014-11-11 10:36:58 +00:00

1115 lines
38 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, ByVal bReloadUI As Boolean)
' Documento e vista
Private m_Scene As Scene
' Stato e comandi
Public Enum CMD As Integer
NULL = 0
GRID
GRID_ELEVATION
GRID_ORIGIN
GRID_ROTATE
GRID_3P
NEWPART
NEWLAYER
SETCURRPARTLAYER
RESETCURRPARTLAYER
LAYERCOLOR
SHOW
HIDE
POINT
LINE2P
ARCCSE
ARC3P
CIRCLECR
PLANE
EXTRUDE
REVOLVE
DELETE
CHANGECOLOR
RESETCOLOR
INVERTCRVSURF
BREAKCURVE
JOINCURVE
SEPARATECURVE
MOVE
COPY
ROTATE
ROTATE3D
MIRROR
End Enum
Public Enum GRID_TYPE As Integer
NONE = 0
TOP
FRONT
RIGHT
BACK
LEFT
BOTTOM
End Enum
Private m_nLastCmd As CMD = CMD.NULL
Private Enum EST As Integer
NULL = 0
GRID_ELEVATION_1
GRID_ORIGIN_1
GRID_ROTATE_1
GRID_ROTATE_2
GRID_ROTATE_3
GRID_3P_1
GRID_3P_2
GRID_3P_3
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
BREAKCURVE_1
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.GRID
Dim frNew As New Frame3d
Select Case m_nLast1
Case GRID_TYPE.TOP
frNew.Setup(Point3d.ORIG, Vector3d.X_AX, Vector3d.Y_AX, Vector3d.Z_AX)
Case GRID_TYPE.FRONT
frNew.Setup(Point3d.ORIG, Vector3d.X_AX, Vector3d.Z_AX, -Vector3d.Y_AX)
Case GRID_TYPE.RIGHT
frNew.Setup(Point3d.ORIG, Vector3d.Y_AX, Vector3d.Z_AX, Vector3d.X_AX)
Case GRID_TYPE.BACK
frNew.Setup(Point3d.ORIG, -Vector3d.X_AX, Vector3d.Z_AX, Vector3d.Y_AX)
Case GRID_TYPE.LEFT
frNew.Setup(Point3d.ORIG, -Vector3d.Y_AX, Vector3d.Z_AX, -Vector3d.X_AX)
Case GRID_TYPE.BOTTOM
frNew.Setup(Point3d.ORIG, -Vector3d.X_AX, Vector3d.Y_AX, -Vector3d.Z_AX)
Case Else
Return False
End Select
EgtSetGridFrame(frNew)
EgtDraw()
Case CMD.GRID_ELEVATION
' non serve il gruppo di drag
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per elevazione griglia
m_nStatus = EST.GRID_ELEVATION_1
' abilito dialogo
RaiseEvent SetInputBox("GRID", "Insert Elevation", IBT.TY_DOUBLE)
Case CMD.GRID_ORIGIN
' non serve il gruppo di drag
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per origine griglia
m_nStatus = EST.GRID_ORIGIN_1
' abilito dialogo
RaiseEvent SetInputBox("GRID", "Insert Origin", IBT.TY_POINT3D)
Case CMD.GRID_ROTATE
' non serve il gruppo di drag
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per rotazione griglia
m_nStatus = EST.GRID_ROTATE_1
' abilito dialogo
RaiseEvent SetInputBox("GRID ROTATE", "Insert First Point on Axis", IBT.TY_POINT3D)
Case CMD.GRID_3P
' non serve il gruppo di drag
m_Scene.SetStatusSelPoint()
' imposto stato a primo punto per rotazione griglia
m_nStatus = EST.GRID_3P_1
' abilito dialogo
RaiseEvent SetInputBox("GRID 3 POINTS", "Insert Origin", IBT.TY_POINT3D)
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.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.SHOW
If m_nLast1 <> GDB_ID.NULL Then
Dim nStat As GDB_ST = GDB_ST.ON_
EgtGetStatus(m_nLast1, nStat)
If nStat = GDB_ST.OFF Then
EgtSetStatus(m_nLast1, GDB_ST.ON_)
SetModified(False)
EgtDraw()
End If
End If
Case CMD.HIDE
If m_nLast1 <> GDB_ID.NULL Then
Dim nStat As GDB_ST = GDB_ST.ON_
EgtGetStatus(m_nLast1, nStat)
If nStat <> GDB_ST.OFF Then
EgtSetStatus(m_nLast1, GDB_ST.OFF)
SetModified(False)
EgtDraw()
End If
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()
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
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
' reset
m_Scene.ResetStatus()
m_nStatus = EST.NULL
SetModified()
End If
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()
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()
Case CMD.INVERTCRVSURF
' lancio l'inversione delle curve/superfici
Dim nId As Integer = EgtGetFirstSelectedObj()
While nId <> GDB_ID.NULL
Select Case EgtGetType(nId)
Case GDB_TY.CRV_LINE, GDB_TY.CRV_ARC, GDB_TY.CRV_BEZ, GDB_TY.CRV_COMPO
EgtInvertCurve(nId)
Case GDB_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()
Case CMD.BREAKCURVE
m_Scene.SetStatusSelPoint()
' imposto stato a punto per BreakCurve
m_nStatus = EST.BREAKCURVE_1
' abilito dialogo
RaiseEvent SetInputBox("BREAK", "Insert Point on Curve", IBT.TY_POINT3D)
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()
Case CMD.SEPARATECURVE
' divido la curva composita nelle curve componenti
EgtSeparateCurveCompo(EgtGetFirstSelectedObj())
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' reset stato
m_nStatus = EST.NULL
SetModified()
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
' Grid origin
Case EST.GRID_ELEVATION_1
' recupero il piano di griglia corrente
Dim frCurr As New Frame3d
EgtGetGridFrame(frCurr)
' cambio l'elevazione dell'origine
frCurr.Move(EgtGetGridVersZ() * m_dLast)
' imposto nuova griglia
EgtSetGridFrame(frCurr)
' reset stato scena
m_Scene.ResetStatus()
' aggiorno stato
m_nStatus = EST.NULL
RaiseEvent UpdateUI(Me, False)
Case EST.GRID_ORIGIN_1
' recupero il piano di griglia corrente
Dim frCurr As New Frame3d
EgtGetGridFrame(frCurr)
' ne modifico l'origine
frCurr.Move(m_ptLast - frCurr.Orig())
' imposto nuova griglia
EgtSetGridFrame(frCurr)
' reset stato scena
m_Scene.ResetStatus()
' aggiorno stato
m_nStatus = EST.NULL
RaiseEvent UpdateUI(Me, False)
Case EST.GRID_ROTATE_1
m_ptP1 = m_ptLast
m_ptP2 = m_ptP1
m_nStatus = EST.GRID_ROTATE_2
RaiseEvent SetInputBox("GRID ROTATE", "Insert Second Point on Axis", IBT.TY_POINT3D)
Case EST.GRID_ROTATE_2
m_ptP2 = m_ptLast
m_nStatus = EST.GRID_ROTATE_3
RaiseEvent SetInputBox("GRID ROTATE", "Insert angle", IBT.TY_DOUBLE)
Case EST.GRID_ROTATE_3
' eseguo rotazione
Dim VtAx As Vector3d = m_ptP2 - m_ptP1
Dim frCurr As New Frame3d
EgtGetGridFrame(frCurr)
frCurr.Rotate(m_ptP1, VtAx, m_dLast)
EgtSetGridFrame(frCurr)
' reset
m_Scene.ResetStatus()
m_nStatus = EST.NULL
RaiseEvent UpdateUI(Me, False)
Case EST.GRID_3P_1
m_ptP1 = m_ptLast
m_ptP2 = m_ptP1
m_nStatus = EST.GRID_3P_2
RaiseEvent SetInputBox("GRID 3 POINTS", "Insert Point on X Axis", IBT.TY_POINT3D)
Case EST.GRID_3P_2
m_ptP2 = m_ptLast
m_nStatus = EST.GRID_3P_3
RaiseEvent SetInputBox("GRID 3 POINTS", "Insert Point Near Y Axis", IBT.TY_POINT3D)
Case EST.GRID_3P_3
' calcolo griglia per 3 punti
Dim frCurr As New Frame3d
If Not frCurr.Setup(m_ptP1, m_ptP2, m_ptLast) Then
m_Scene.ResetStatus()
m_nStatus = EST.NULL
Return False
End If
EgtSetGridFrame(frCurr)
' reset
m_Scene.ResetStatus()
m_nStatus = EST.NULL
RaiseEvent UpdateUI(Me, False)
' 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()
' 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()
' 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()
' 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()
' 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()
' 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 Vector3d = EgtGetGridVersZ().Loc(GetCurrLayer()) * m_dLast
EgtCreateSurfTriMeshByExtrusion(GetCurrLayer(), EgtGetFirstSelectedObj(), VtExtr, EPS_STM)
EgtDeselectAll()
EgtDraw()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
' 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()
' Break Curve
Case EST.BREAKCURVE_1
' eseguo spezzatura
EgtSplitCurveAtPoint(EgtGetFirstSelectedObj(), m_ptLast)
EgtDeselectAll()
' reset stato scena
m_Scene.ResetStatus()
' aggiorno stato
m_nStatus = EST.NULL
SetModified()
' 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()
' 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()
' 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()
EgtSetGeoLine(m_ptP1, m_ptLast)
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()
' 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
m_dLast = 0
' 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()
' 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()
Case Else
Return False
End Select
Return True
End Function
Public Function ExecuteDrag() As Boolean
Select Case m_nStatus
Case EST.GRID_ROTATE_2, EST.GRID_ROTATE_3
EgtSetGeoLine(m_ptP1, m_ptP2)
EgtDraw()
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) <> GDB_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) <> GDB_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_2
EgtSetGeoLine(m_ptP1, m_ptLast)
EgtDraw()
Case EST.ROTATE_3
EgtSetGeoLine(m_ptP1, m_ptLast)
' 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
EgtSetGeoLine(m_ptP1, m_ptP2)
' 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
' reset
m_nCurrPart = GDB_ID.NULL
m_nCurrLayer = GDB_ID.NULL
' verifico esistenza e validità pezzo
If EgtExistsObj(nPart) And EgtGetParent(nPart) = GDB_ID.ROOT Then
m_nCurrPart = nPart
Else
Return False
End If
' verifico esistenza e validità layer
If EgtExistsObj(nLayer) And EgtGetParent(nLayer) = nPart Then
m_nCurrLayer = nLayer
Else
Return False
End If
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(Optional ByVal bReloadUI As Boolean = True)
m_bModified = True
RaiseEvent UpdateUI(Me, bReloadUI)
End Sub
Public Sub ResetModified(Optional ByVal bReloadUI As Boolean = True)
m_bModified = False
RaiseEvent UpdateUI(Me, bReloadUI)
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