'---------------------------------------------------------------------------- ' 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