diff --git a/Controller.vb b/Controller.vb new file mode 100644 index 0000000..c984229 --- /dev/null +++ b/Controller.vb @@ -0,0 +1,940 @@ +'---------------------------------------------------------------------------- +' 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 diff --git a/EgtInterface.vb b/EgtInterface.vb index e90294c..300e7d9 100644 --- a/EgtInterface.vb +++ b/EgtInterface.vb @@ -663,8 +663,8 @@ Public Shared Function EgtCreateCurveLine(ByVal nParentId As Integer, End Function -Public Shared Function EgtCreateCurveArc3P(ByVal nParentId As Integer, - ByRef PtStart As Point3d, ByRef PtMid As Point3d, ByRef PtEnd As Point3d) As Integer +Public Shared Function EgtCreateCurveCircleCPN(ByVal nParentId As Integer, + ByRef PtCen As Point3d, ByRef PtOn As Point3d, ByRef VtNorm As Vector3d) As Integer End Function @@ -673,10 +673,29 @@ Public Shared Function EgtCreateCurveArcC2PN(ByVal nParentId As Integer, ByRef VtNorm As Vector3d) As Integer End Function + +Public Shared Function EgtCreateCurveArc3P(ByVal nParentId As Integer, + ByRef PtStart As Point3d, ByRef PtMid As Point3d, ByRef PtEnd As Point3d) As Integer +End Function + + +Public Shared Function EgtCreateCurveCompoByChain(ByVal nParentId As Integer, ByVal nNumCrv As Integer, ByVal nCrvId() As Integer, ByRef PtNearStart As Point3d, ByVal bCrvErase As Boolean) As Integer +End Function + Public Shared Function EgtCreateSurfTriMeshByContour(ByVal nParentId As Integer, ByVal nCrvId As Integer, ByVal dLinTol As Double) As Integer End Function + +Public Shared Function EgtCreateSurfTriMeshByExtrusion(ByVal nParentId As Integer, ByVal nCrvId As Integer, ByRef VtExtr As Vector3d, ByVal dLinTol As Double) As Integer +End Function + + +Public Shared Function EgtCreateSurfTriMeshByScrewing(ByVal nParentId As Integer, ByVal nCrvId As Integer, + ByRef PtAx As Point3d, ByRef VtAx As Vector3d, + ByVal dAngRotDeg As Double, ByVal dMove As Double, ByVal dLinTol As Double) As Integer +End Function + '---------- GeomDb Objects Modify ---------------------------------------------- Private Shared Function EgtChangeGroupFrame(ByVal nId As Integer, @@ -686,6 +705,10 @@ Public Shared Function EgtChangeGroupFrame(ByVal nId As Integer, ByRef frRef As Return EgtChangeGroupFrame(nId, frRef.Orig(), frRef.VersX(), frRef.VersY(), frRef.VersZ()) End Function + +Public Shared Function EgtInvertSurface(ByVal nId As Integer) As Boolean +End Function + Public Shared Function EgtFlipText(ByVal nId As Integer) As Boolean End Function @@ -705,13 +728,21 @@ Public Shared Function EgtModifyCurveEndPoint(ByVal nId As Integer, ByRef PtEnd End Function -Public Shared Function EgtModifyCurveArc3P(ByVal nId As Integer, ByRef PtMid As Point3d) As Boolean +Public Shared Function EgtModifyCurveCircleCPN(ByVal nId As Integer, ByRef PtOn As Point3d) As Boolean End Function Public Shared Function EgtModifyCurveArcC2PN(ByVal nId As Integer, ByRef PtEnd As Point3d) As Boolean End Function + +Public Shared Function EgtModifyCurveArc3P(ByVal nId As Integer, ByRef PtMid As Point3d) As Boolean +End Function + + +Public Shared Function EgtSplitCurveCompo(ByVal nId As Integer) As Boolean +End Function + '---------- GeomDb Objects ----------------------------------------------------- @@ -909,6 +940,10 @@ End Function Public Shared Function EgtSetColor(ByVal nId As Integer, ByRef ColObj As Color3d) As Boolean End Function + +Public Shared Function EgtResetColor(ByVal nId As Integer) As Boolean +End Function + Public Shared Function EgtGetColor(ByVal nId As Integer, ByRef ColObj As Color3d) As Boolean End Function @@ -981,6 +1016,10 @@ End Function Public Shared Function EgtIsSelectedObj(ByVal nId As Integer) As Boolean End Function + +Public Shared Function EgtGetSelectedObjNbr() As Integer +End Function + Public Shared Function EgtGetFirstSelectedObj() As Integer End Function @@ -1200,6 +1239,17 @@ Public Shared Function EgtGetGraphicSnapPoint(ByVal nSnap As Integer, Return EgtGetGraphicSnapPoint(nSnap, PtWin.X, PtWin.Y, nSelW, nSelH, ptP) End Function + +Private Shared Function EgtGetGridSnapPointZ(ByVal bSketch As Boolean, + ByVal nWinX As Integer, ByVal nWinY As Integer, ByRef ptGrid As Point3d, + ByRef ptP As Point3d) As Boolean +End Function +Public Shared Function EgtGetGridSnapPointZ(ByVal bSketch As Boolean, + ByVal PtWin As Point, ByVal ptGrid As Point3d, + ByRef ptP As Point3d) As Boolean + Return EgtGetGridSnapPointZ(bSketch, PtWin.X, PtWin.Y, ptGrid, ptP) +End Function + Public Shared Function EgtSetShowMode(ByVal nShowMode As SM, Optional ByVal bRedraw As Boolean = True) As Boolean End Function @@ -1324,6 +1374,7 @@ End Function 'Costanti : GEOMETRIA Public Const EPS_SMALL As Double = 0.001 Public Const EPS_ZERO As Double = 0.0000001 +Public Const EPS_STM As Double = 0.05 'Costanti : TIPO DI FILE Public Enum FT As Integer NULL = 0 diff --git a/Form1.Designer.vb b/Form1.Designer.vb index 2336654..b4ae452 100644 --- a/Form1.Designer.vb +++ b/Form1.Designer.vb @@ -73,15 +73,26 @@ Partial Class Form1 Me.btnNewLayer = New System.Windows.Forms.Button() Me.txtPartLay = New System.Windows.Forms.TextBox() Me.btnNewPart = New System.Windows.Forms.Button() + Me.InputBox = New System.Windows.Forms.GroupBox() + Me.InputCheck = New System.Windows.Forms.CheckBox() + Me.InputText = New System.Windows.Forms.TextBox() + Me.InputLabel = New System.Windows.Forms.Label() Me.TabControl2 = New System.Windows.Forms.TabControl() Me.TabDraw = New System.Windows.Forms.TabPage() + Me.btnCircleCR = New System.Windows.Forms.Button() Me.btnArc3P = New System.Windows.Forms.Button() Me.btnArcCSE = New System.Windows.Forms.Button() Me.btnPoint = New System.Windows.Forms.Button() Me.btnLine2P = New System.Windows.Forms.Button() Me.TabConstruct = New System.Windows.Forms.TabPage() + Me.btnRevolve = New System.Windows.Forms.Button() + Me.btnExtrude = New System.Windows.Forms.Button() Me.btnPlane = New System.Windows.Forms.Button() Me.TabEdit = New System.Windows.Forms.TabPage() + Me.btnChangeColor = New System.Windows.Forms.Button() + Me.btnSplitCurve = New System.Windows.Forms.Button() + Me.btnJoinCurve = New System.Windows.Forms.Button() + Me.btnInvertCurve = New System.Windows.Forms.Button() Me.btnDelete = New System.Windows.Forms.Button() Me.TabTransform = New System.Windows.Forms.TabPage() Me.btnMirror = New System.Windows.Forms.Button() @@ -98,7 +109,6 @@ Partial Class Form1 Me.ObjTreeTimer = New System.Windows.Forms.Timer(Me.components) Me.ColorDialog1 = New System.Windows.Forms.ColorDialog() Me.Scene1 = New TestEIn.Scene() - Me.btnInvertCurve = New System.Windows.Forms.Button() Me.TableLayoutPanel1.SuspendLayout() Me.StatusStrip1.SuspendLayout() Me.TabControl1.SuspendLayout() @@ -110,6 +120,7 @@ Partial Class Form1 CType(Me.PictureBox3, System.ComponentModel.ISupportInitialize).BeginInit() Me.TableLayoutPanel3.SuspendLayout() Me.Panel1.SuspendLayout() + Me.InputBox.SuspendLayout() Me.TabControl2.SuspendLayout() Me.TabDraw.SuspendLayout() Me.TabConstruct.SuspendLayout() @@ -231,7 +242,7 @@ Partial Class Form1 Me.btnSaveAs.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnSaveAs.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnSaveAs.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnSaveAs.Image = Global.TestEIn.My.Resources.Resources.SaveAs + Me.btnSaveAs.Image = CType(resources.GetObject("btnSaveAs.Image"), System.Drawing.Image) Me.btnSaveAs.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnSaveAs.Location = New System.Drawing.Point(168, 0) Me.btnSaveAs.Margin = New System.Windows.Forms.Padding(2) @@ -258,7 +269,7 @@ Partial Class Form1 Me.btnNew.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnNew.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnNew.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnNew.Image = Global.TestEIn.My.Resources.Resources._New + Me.btnNew.Image = CType(resources.GetObject("btnNew.Image"), System.Drawing.Image) Me.btnNew.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnNew.Location = New System.Drawing.Point(0, 0) Me.btnNew.Margin = New System.Windows.Forms.Padding(2) @@ -295,7 +306,7 @@ Partial Class Form1 Me.btnSave.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnSave.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnSave.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnSave.Image = Global.TestEIn.My.Resources.Resources.Save + Me.btnSave.Image = CType(resources.GetObject("btnSave.Image"), System.Drawing.Image) Me.btnSave.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnSave.Location = New System.Drawing.Point(112, 0) Me.btnSave.Margin = New System.Windows.Forms.Padding(2) @@ -313,7 +324,7 @@ Partial Class Form1 Me.btnImport.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnImport.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnImport.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnImport.Image = Global.TestEIn.My.Resources.Resources.Import + Me.btnImport.Image = CType(resources.GetObject("btnImport.Image"), System.Drawing.Image) Me.btnImport.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnImport.Location = New System.Drawing.Point(224, 0) Me.btnImport.Name = "btnImport" @@ -330,7 +341,7 @@ Partial Class Form1 Me.btnExport.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnExport.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnExport.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnExport.Image = Global.TestEIn.My.Resources.Resources.Export + Me.btnExport.Image = CType(resources.GetObject("btnExport.Image"), System.Drawing.Image) Me.btnExport.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnExport.Location = New System.Drawing.Point(280, 0) Me.btnExport.Name = "btnExport" @@ -347,7 +358,7 @@ Partial Class Form1 Me.btnExec.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnExec.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnExec.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnExec.Image = Global.TestEIn.My.Resources.Resources.Exec + Me.btnExec.Image = CType(resources.GetObject("btnExec.Image"), System.Drawing.Image) Me.btnExec.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnExec.Location = New System.Drawing.Point(340, 0) Me.btnExec.Name = "btnExec" @@ -395,7 +406,7 @@ Partial Class Form1 Me.btnIsoNW.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnIsoNW.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnIsoNW.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnIsoNW.Image = Global.TestEIn.My.Resources.Resources.LookFromISO_NW + Me.btnIsoNW.Image = CType(resources.GetObject("btnIsoNW.Image"), System.Drawing.Image) Me.btnIsoNW.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnIsoNW.Location = New System.Drawing.Point(796, 0) Me.btnIsoNW.Name = "btnIsoNW" @@ -412,7 +423,7 @@ Partial Class Form1 Me.btnIsoNE.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnIsoNE.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnIsoNE.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnIsoNE.Image = Global.TestEIn.My.Resources.Resources.LookFromISO_NE + Me.btnIsoNE.Image = CType(resources.GetObject("btnIsoNE.Image"), System.Drawing.Image) Me.btnIsoNE.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnIsoNE.Location = New System.Drawing.Point(740, 0) Me.btnIsoNE.Name = "btnIsoNE" @@ -429,7 +440,7 @@ Partial Class Form1 Me.btnIsoSE.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnIsoSE.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnIsoSE.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnIsoSE.Image = Global.TestEIn.My.Resources.Resources.LookFromISO_SE + Me.btnIsoSE.Image = CType(resources.GetObject("btnIsoSE.Image"), System.Drawing.Image) Me.btnIsoSE.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnIsoSE.Location = New System.Drawing.Point(684, 0) Me.btnIsoSE.Name = "btnIsoSE" @@ -448,7 +459,7 @@ Partial Class Form1 Me.chkGetDist.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.chkGetDist.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.chkGetDist.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.chkGetDist.Image = Global.TestEIn.My.Resources.Resources.GetDist + Me.chkGetDist.Image = CType(resources.GetObject("chkGetDist.Image"), System.Drawing.Image) Me.chkGetDist.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.chkGetDist.Location = New System.Drawing.Point(968, 0) Me.chkGetDist.Name = "chkGetDist" @@ -467,7 +478,7 @@ Partial Class Form1 Me.chkAnalyze.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.chkAnalyze.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.chkAnalyze.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.chkAnalyze.Image = Global.TestEIn.My.Resources.Resources.Analyze + Me.chkAnalyze.Image = CType(resources.GetObject("chkAnalyze.Image"), System.Drawing.Image) Me.chkAnalyze.Location = New System.Drawing.Point(912, 0) Me.chkAnalyze.Name = "chkAnalyze" Me.chkAnalyze.Size = New System.Drawing.Size(56, 48) @@ -503,7 +514,7 @@ Partial Class Form1 Me.chkCurveDir.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.chkCurveDir.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.chkCurveDir.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.chkCurveDir.Image = Global.TestEIn.My.Resources.Resources.CurveDir + Me.chkCurveDir.Image = CType(resources.GetObject("chkCurveDir.Image"), System.Drawing.Image) Me.chkCurveDir.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.chkCurveDir.Location = New System.Drawing.Point(856, 0) Me.chkCurveDir.Name = "chkCurveDir" @@ -531,7 +542,7 @@ Partial Class Form1 Me.rbtShading.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.rbtShading.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.rbtShading.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.rbtShading.Image = Global.TestEIn.My.Resources.Resources.RenderingSH + Me.rbtShading.Image = CType(resources.GetObject("rbtShading.Image"), System.Drawing.Image) Me.rbtShading.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.rbtShading.Location = New System.Drawing.Point(112, 0) Me.rbtShading.Name = "rbtShading" @@ -552,7 +563,7 @@ Partial Class Form1 Me.rbtWireFrame.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.rbtWireFrame.FlatStyle = System.Windows.Forms.FlatStyle.Flat Me.rbtWireFrame.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.rbtWireFrame.Image = Global.TestEIn.My.Resources.Resources.RenderingWF + Me.rbtWireFrame.Image = CType(resources.GetObject("rbtWireFrame.Image"), System.Drawing.Image) Me.rbtWireFrame.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.rbtWireFrame.Location = New System.Drawing.Point(0, 0) Me.rbtWireFrame.Name = "rbtWireFrame" @@ -572,7 +583,7 @@ Partial Class Form1 Me.rbtHiddenLine.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.rbtHiddenLine.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.rbtHiddenLine.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.rbtHiddenLine.Image = Global.TestEIn.My.Resources.Resources.RenderingHL + Me.rbtHiddenLine.Image = CType(resources.GetObject("rbtHiddenLine.Image"), System.Drawing.Image) Me.rbtHiddenLine.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.rbtHiddenLine.Location = New System.Drawing.Point(56, 0) Me.rbtHiddenLine.Name = "rbtHiddenLine" @@ -590,7 +601,7 @@ Partial Class Form1 Me.btnZoomOut.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnZoomOut.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnZoomOut.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnZoomOut.Image = Global.TestEIn.My.Resources.Resources.ZoomOut + Me.btnZoomOut.Image = CType(resources.GetObject("btnZoomOut.Image"), System.Drawing.Image) Me.btnZoomOut.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnZoomOut.Location = New System.Drawing.Point(284, 0) Me.btnZoomOut.Name = "btnZoomOut" @@ -607,7 +618,7 @@ Partial Class Form1 Me.btnIsoSW.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnIsoSW.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnIsoSW.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnIsoSW.Image = Global.TestEIn.My.Resources.Resources.LookFromISO_SW + Me.btnIsoSW.Image = CType(resources.GetObject("btnIsoSW.Image"), System.Drawing.Image) Me.btnIsoSW.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnIsoSW.Location = New System.Drawing.Point(628, 0) Me.btnIsoSW.Name = "btnIsoSW" @@ -624,7 +635,7 @@ Partial Class Form1 Me.btnBack.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnBack.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnBack.Image = Global.TestEIn.My.Resources.Resources.LookFromBACK + Me.btnBack.Image = CType(resources.GetObject("btnBack.Image"), System.Drawing.Image) Me.btnBack.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnBack.Location = New System.Drawing.Point(516, 0) Me.btnBack.Name = "btnBack" @@ -641,7 +652,7 @@ Partial Class Form1 Me.btnRight.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnRight.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnRight.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnRight.Image = Global.TestEIn.My.Resources.Resources.LookFromRIGHT + Me.btnRight.Image = CType(resources.GetObject("btnRight.Image"), System.Drawing.Image) Me.btnRight.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnRight.Location = New System.Drawing.Point(460, 0) Me.btnRight.Name = "btnRight" @@ -658,7 +669,7 @@ Partial Class Form1 Me.btnLeft.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnLeft.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnLeft.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnLeft.Image = Global.TestEIn.My.Resources.Resources.LookFromLEFT + Me.btnLeft.Image = CType(resources.GetObject("btnLeft.Image"), System.Drawing.Image) Me.btnLeft.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnLeft.Location = New System.Drawing.Point(572, 0) Me.btnLeft.Name = "btnLeft" @@ -675,7 +686,7 @@ Partial Class Form1 Me.btnZoomAll.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnZoomAll.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnZoomAll.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnZoomAll.Image = Global.TestEIn.My.Resources.Resources.ZoomAll + Me.btnZoomAll.Image = CType(resources.GetObject("btnZoomAll.Image"), System.Drawing.Image) Me.btnZoomAll.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnZoomAll.Location = New System.Drawing.Point(172, 0) Me.btnZoomAll.Name = "btnZoomAll" @@ -692,7 +703,7 @@ Partial Class Form1 Me.btnFront.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnFront.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnFront.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnFront.Image = Global.TestEIn.My.Resources.Resources.LookFromFRONT + Me.btnFront.Image = CType(resources.GetObject("btnFront.Image"), System.Drawing.Image) Me.btnFront.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnFront.Location = New System.Drawing.Point(404, 0) Me.btnFront.Name = "btnFront" @@ -709,7 +720,7 @@ Partial Class Form1 Me.btnZoomIn.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnZoomIn.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnZoomIn.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnZoomIn.Image = Global.TestEIn.My.Resources.Resources.ZoomIn + Me.btnZoomIn.Image = CType(resources.GetObject("btnZoomIn.Image"), System.Drawing.Image) Me.btnZoomIn.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnZoomIn.Location = New System.Drawing.Point(228, 0) Me.btnZoomIn.Name = "btnZoomIn" @@ -726,7 +737,7 @@ Partial Class Form1 Me.btnTop.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnTop.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnTop.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnTop.Image = Global.TestEIn.My.Resources.Resources.LookFromTOP + Me.btnTop.Image = CType(resources.GetObject("btnTop.Image"), System.Drawing.Image) Me.btnTop.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnTop.Location = New System.Drawing.Point(348, 0) Me.btnTop.Name = "btnTop" @@ -741,17 +752,19 @@ Partial Class Form1 Me.TableLayoutPanel3.ColumnCount = 1 Me.TableLayoutPanel3.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) Me.TableLayoutPanel3.Controls.Add(Me.tBoxInfo, 0, 2) - Me.TableLayoutPanel3.Controls.Add(Me.tboxCmd, 0, 3) + Me.TableLayoutPanel3.Controls.Add(Me.tboxCmd, 0, 4) Me.TableLayoutPanel3.Controls.Add(Me.TreeView1, 0, 1) Me.TableLayoutPanel3.Controls.Add(Me.Panel1, 0, 0) + Me.TableLayoutPanel3.Controls.Add(Me.InputBox, 0, 3) Me.TableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill Me.TableLayoutPanel3.Location = New System.Drawing.Point(853, 83) Me.TableLayoutPanel3.Name = "TableLayoutPanel3" - Me.TableLayoutPanel3.RowCount = 4 + Me.TableLayoutPanel3.RowCount = 5 + Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50.0!)) + Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 70.0!)) + Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30.0!)) + Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 140.0!)) Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50.0!)) - Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60.0!)) - Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40.0!)) - Me.TableLayoutPanel3.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 80.0!)) Me.TableLayoutPanel3.Size = New System.Drawing.Size(200, 425) Me.TableLayoutPanel3.TabIndex = 9 ' @@ -759,22 +772,23 @@ Partial Class Form1 ' Me.tBoxInfo.BackColor = System.Drawing.SystemColors.ControlLightLight Me.tBoxInfo.Dock = System.Windows.Forms.DockStyle.Fill - Me.tBoxInfo.Location = New System.Drawing.Point(3, 230) + Me.tBoxInfo.Location = New System.Drawing.Point(3, 180) + Me.tBoxInfo.Margin = New System.Windows.Forms.Padding(3, 1, 3, 3) Me.tBoxInfo.Multiline = True Me.tBoxInfo.Name = "tBoxInfo" Me.tBoxInfo.ReadOnly = True Me.tBoxInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical - Me.tBoxInfo.Size = New System.Drawing.Size(194, 112) + Me.tBoxInfo.Size = New System.Drawing.Size(194, 51) Me.tBoxInfo.TabIndex = 24 ' 'tboxCmd ' Me.tboxCmd.Dock = System.Windows.Forms.DockStyle.Fill - Me.tboxCmd.Location = New System.Drawing.Point(3, 348) + Me.tboxCmd.Location = New System.Drawing.Point(3, 377) Me.tboxCmd.Multiline = True Me.tboxCmd.Name = "tboxCmd" Me.tboxCmd.ScrollBars = System.Windows.Forms.ScrollBars.Vertical - Me.tboxCmd.Size = New System.Drawing.Size(194, 74) + Me.tboxCmd.Size = New System.Drawing.Size(194, 45) Me.tboxCmd.TabIndex = 23 ' 'TreeView1 @@ -785,9 +799,10 @@ Partial Class Form1 Me.TreeView1.ImageIndex = 0 Me.TreeView1.ImageList = Me.ImageList1 Me.TreeView1.Location = New System.Drawing.Point(3, 53) + Me.TreeView1.Margin = New System.Windows.Forms.Padding(3, 3, 3, 0) Me.TreeView1.Name = "TreeView1" Me.TreeView1.SelectedImageIndex = 0 - Me.TreeView1.Size = New System.Drawing.Size(194, 171) + Me.TreeView1.Size = New System.Drawing.Size(194, 126) Me.TreeView1.TabIndex = 0 ' 'ImageList1 @@ -871,6 +886,51 @@ Partial Class Form1 Me.btnNewPart.Text = "New Part" Me.btnNewPart.UseVisualStyleBackColor = True ' + 'InputBox + ' + Me.InputBox.AutoSize = True + Me.InputBox.Controls.Add(Me.InputCheck) + Me.InputBox.Controls.Add(Me.InputText) + Me.InputBox.Controls.Add(Me.InputLabel) + Me.InputBox.Dock = System.Windows.Forms.DockStyle.Fill + Me.InputBox.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.InputBox.Location = New System.Drawing.Point(3, 237) + Me.InputBox.Name = "InputBox" + Me.InputBox.Size = New System.Drawing.Size(194, 134) + Me.InputBox.TabIndex = 26 + Me.InputBox.TabStop = False + ' + 'InputCheck + ' + Me.InputCheck.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.InputCheck.Location = New System.Drawing.Point(6, 85) + Me.InputCheck.Name = "InputCheck" + Me.InputCheck.Size = New System.Drawing.Size(184, 26) + Me.InputCheck.TabIndex = 2 + Me.InputCheck.Text = "CheckBox1" + Me.InputCheck.UseVisualStyleBackColor = True + Me.InputCheck.Visible = False + ' + 'InputText + ' + Me.InputText.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.InputText.Location = New System.Drawing.Point(3, 50) + Me.InputText.MinimumSize = New System.Drawing.Size(188, 26) + Me.InputText.Name = "InputText" + Me.InputText.Size = New System.Drawing.Size(188, 23) + Me.InputText.TabIndex = 1 + Me.InputText.Visible = False + ' + 'InputLabel + ' + Me.InputLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.InputLabel.Location = New System.Drawing.Point(4, 19) + Me.InputLabel.Name = "InputLabel" + Me.InputLabel.Size = New System.Drawing.Size(188, 23) + Me.InputLabel.TabIndex = 0 + Me.InputLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + Me.InputLabel.Visible = False + ' 'TabControl2 ' Me.TabControl2.Alignment = System.Windows.Forms.TabAlignment.Left @@ -891,6 +951,7 @@ Partial Class Form1 'TabDraw ' Me.TabDraw.BackColor = System.Drawing.SystemColors.Control + Me.TabDraw.Controls.Add(Me.btnCircleCR) Me.TabDraw.Controls.Add(Me.btnArc3P) Me.TabDraw.Controls.Add(Me.btnArcCSE) Me.TabDraw.Controls.Add(Me.btnPoint) @@ -902,6 +963,23 @@ Partial Class Form1 Me.TabDraw.TabIndex = 0 Me.TabDraw.Text = "Draw" ' + 'btnCircleCR + ' + Me.btnCircleCR.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control + Me.btnCircleCR.FlatAppearance.BorderSize = 0 + Me.btnCircleCR.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control + Me.btnCircleCR.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption + Me.btnCircleCR.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnCircleCR.Image = CType(resources.GetObject("btnCircleCR.Image"), System.Drawing.Image) + Me.btnCircleCR.ImageAlign = System.Drawing.ContentAlignment.TopCenter + Me.btnCircleCR.Location = New System.Drawing.Point(0, 96) + Me.btnCircleCR.Name = "btnCircleCR" + Me.btnCircleCR.Size = New System.Drawing.Size(56, 48) + Me.btnCircleCR.TabIndex = 34 + Me.btnCircleCR.Text = "Circle cr" + Me.btnCircleCR.TextAlign = System.Drawing.ContentAlignment.BottomCenter + Me.btnCircleCR.UseVisualStyleBackColor = False + ' 'btnArc3P ' Me.btnArc3P.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control @@ -909,9 +987,9 @@ Partial Class Form1 Me.btnArc3P.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnArc3P.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnArc3P.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnArc3P.Image = Global.TestEIn.My.Resources.Resources.Arc3P + Me.btnArc3P.Image = CType(resources.GetObject("btnArc3P.Image"), System.Drawing.Image) Me.btnArc3P.ImageAlign = System.Drawing.ContentAlignment.TopCenter - Me.btnArc3P.Location = New System.Drawing.Point(0, 144) + Me.btnArc3P.Location = New System.Drawing.Point(0, 192) Me.btnArc3P.Name = "btnArc3P" Me.btnArc3P.Size = New System.Drawing.Size(56, 48) Me.btnArc3P.TabIndex = 33 @@ -926,9 +1004,9 @@ Partial Class Form1 Me.btnArcCSE.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnArcCSE.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnArcCSE.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnArcCSE.Image = Global.TestEIn.My.Resources.Resources.ArcCSE + Me.btnArcCSE.Image = CType(resources.GetObject("btnArcCSE.Image"), System.Drawing.Image) Me.btnArcCSE.ImageAlign = System.Drawing.ContentAlignment.TopCenter - Me.btnArcCSE.Location = New System.Drawing.Point(0, 96) + Me.btnArcCSE.Location = New System.Drawing.Point(0, 144) Me.btnArcCSE.Name = "btnArcCSE" Me.btnArcCSE.Size = New System.Drawing.Size(56, 48) Me.btnArcCSE.TabIndex = 32 @@ -943,7 +1021,7 @@ Partial Class Form1 Me.btnPoint.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnPoint.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnPoint.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnPoint.Image = Global.TestEIn.My.Resources.Resources.Point + Me.btnPoint.Image = CType(resources.GetObject("btnPoint.Image"), System.Drawing.Image) Me.btnPoint.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnPoint.Location = New System.Drawing.Point(0, 0) Me.btnPoint.Name = "btnPoint" @@ -960,7 +1038,7 @@ Partial Class Form1 Me.btnLine2P.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnLine2P.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnLine2P.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnLine2P.Image = Global.TestEIn.My.Resources.Resources.Line2P + Me.btnLine2P.Image = CType(resources.GetObject("btnLine2P.Image"), System.Drawing.Image) Me.btnLine2P.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnLine2P.Location = New System.Drawing.Point(0, 48) Me.btnLine2P.Name = "btnLine2P" @@ -973,6 +1051,8 @@ Partial Class Form1 'TabConstruct ' Me.TabConstruct.BackColor = System.Drawing.SystemColors.Control + Me.TabConstruct.Controls.Add(Me.btnRevolve) + Me.TabConstruct.Controls.Add(Me.btnExtrude) Me.TabConstruct.Controls.Add(Me.btnPlane) Me.TabConstruct.Location = New System.Drawing.Point(23, 4) Me.TabConstruct.Name = "TabConstruct" @@ -980,6 +1060,40 @@ Partial Class Form1 Me.TabConstruct.TabIndex = 4 Me.TabConstruct.Text = "Construct" ' + 'btnRevolve + ' + Me.btnRevolve.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control + Me.btnRevolve.FlatAppearance.BorderSize = 0 + Me.btnRevolve.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control + Me.btnRevolve.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption + Me.btnRevolve.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnRevolve.Image = CType(resources.GetObject("btnRevolve.Image"), System.Drawing.Image) + Me.btnRevolve.ImageAlign = System.Drawing.ContentAlignment.TopCenter + Me.btnRevolve.Location = New System.Drawing.Point(0, 96) + Me.btnRevolve.Name = "btnRevolve" + Me.btnRevolve.Size = New System.Drawing.Size(56, 48) + Me.btnRevolve.TabIndex = 35 + Me.btnRevolve.Text = "Revolve" + Me.btnRevolve.TextAlign = System.Drawing.ContentAlignment.BottomCenter + Me.btnRevolve.UseVisualStyleBackColor = False + ' + 'btnExtrude + ' + Me.btnExtrude.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control + Me.btnExtrude.FlatAppearance.BorderSize = 0 + Me.btnExtrude.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control + Me.btnExtrude.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption + Me.btnExtrude.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnExtrude.Image = CType(resources.GetObject("btnExtrude.Image"), System.Drawing.Image) + Me.btnExtrude.ImageAlign = System.Drawing.ContentAlignment.TopCenter + Me.btnExtrude.Location = New System.Drawing.Point(0, 48) + Me.btnExtrude.Name = "btnExtrude" + Me.btnExtrude.Size = New System.Drawing.Size(56, 48) + Me.btnExtrude.TabIndex = 34 + Me.btnExtrude.Text = "Extrude" + Me.btnExtrude.TextAlign = System.Drawing.ContentAlignment.BottomCenter + Me.btnExtrude.UseVisualStyleBackColor = False + ' 'btnPlane ' Me.btnPlane.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control @@ -987,7 +1101,7 @@ Partial Class Form1 Me.btnPlane.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnPlane.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnPlane.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnPlane.Image = Global.TestEIn.My.Resources.Resources.Plane + Me.btnPlane.Image = CType(resources.GetObject("btnPlane.Image"), System.Drawing.Image) Me.btnPlane.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnPlane.Location = New System.Drawing.Point(0, 0) Me.btnPlane.Name = "btnPlane" @@ -1000,6 +1114,9 @@ Partial Class Form1 'TabEdit ' Me.TabEdit.BackColor = System.Drawing.SystemColors.Control + Me.TabEdit.Controls.Add(Me.btnChangeColor) + Me.TabEdit.Controls.Add(Me.btnSplitCurve) + Me.TabEdit.Controls.Add(Me.btnJoinCurve) Me.TabEdit.Controls.Add(Me.btnInvertCurve) Me.TabEdit.Controls.Add(Me.btnDelete) Me.TabEdit.Location = New System.Drawing.Point(23, 4) @@ -1008,6 +1125,74 @@ Partial Class Form1 Me.TabEdit.TabIndex = 3 Me.TabEdit.Text = "Edit" ' + 'btnChangeColor + ' + Me.btnChangeColor.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control + Me.btnChangeColor.FlatAppearance.BorderSize = 0 + Me.btnChangeColor.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control + Me.btnChangeColor.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption + Me.btnChangeColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnChangeColor.Image = CType(resources.GetObject("btnChangeColor.Image"), System.Drawing.Image) + Me.btnChangeColor.ImageAlign = System.Drawing.ContentAlignment.TopCenter + Me.btnChangeColor.Location = New System.Drawing.Point(0, 48) + Me.btnChangeColor.Name = "btnChangeColor" + Me.btnChangeColor.Size = New System.Drawing.Size(56, 48) + Me.btnChangeColor.TabIndex = 37 + Me.btnChangeColor.Text = "Color" + Me.btnChangeColor.TextAlign = System.Drawing.ContentAlignment.BottomCenter + Me.btnChangeColor.UseVisualStyleBackColor = False + ' + 'btnSplitCurve + ' + Me.btnSplitCurve.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control + Me.btnSplitCurve.FlatAppearance.BorderSize = 0 + Me.btnSplitCurve.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control + Me.btnSplitCurve.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption + Me.btnSplitCurve.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnSplitCurve.Image = CType(resources.GetObject("btnSplitCurve.Image"), System.Drawing.Image) + Me.btnSplitCurve.ImageAlign = System.Drawing.ContentAlignment.TopCenter + Me.btnSplitCurve.Location = New System.Drawing.Point(0, 192) + Me.btnSplitCurve.Name = "btnSplitCurve" + Me.btnSplitCurve.Size = New System.Drawing.Size(56, 48) + Me.btnSplitCurve.TabIndex = 36 + Me.btnSplitCurve.Text = "Split" + Me.btnSplitCurve.TextAlign = System.Drawing.ContentAlignment.BottomCenter + Me.btnSplitCurve.UseVisualStyleBackColor = False + ' + 'btnJoinCurve + ' + Me.btnJoinCurve.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control + Me.btnJoinCurve.FlatAppearance.BorderSize = 0 + Me.btnJoinCurve.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control + Me.btnJoinCurve.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption + Me.btnJoinCurve.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnJoinCurve.Image = CType(resources.GetObject("btnJoinCurve.Image"), System.Drawing.Image) + Me.btnJoinCurve.ImageAlign = System.Drawing.ContentAlignment.TopCenter + Me.btnJoinCurve.Location = New System.Drawing.Point(0, 144) + Me.btnJoinCurve.Name = "btnJoinCurve" + Me.btnJoinCurve.Size = New System.Drawing.Size(56, 48) + Me.btnJoinCurve.TabIndex = 35 + Me.btnJoinCurve.Text = "Join" + Me.btnJoinCurve.TextAlign = System.Drawing.ContentAlignment.BottomCenter + Me.btnJoinCurve.UseVisualStyleBackColor = False + ' + 'btnInvertCurve + ' + Me.btnInvertCurve.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control + Me.btnInvertCurve.FlatAppearance.BorderSize = 0 + Me.btnInvertCurve.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control + Me.btnInvertCurve.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption + Me.btnInvertCurve.FlatStyle = System.Windows.Forms.FlatStyle.Flat + Me.btnInvertCurve.Image = CType(resources.GetObject("btnInvertCurve.Image"), System.Drawing.Image) + Me.btnInvertCurve.ImageAlign = System.Drawing.ContentAlignment.TopCenter + Me.btnInvertCurve.Location = New System.Drawing.Point(0, 96) + Me.btnInvertCurve.Name = "btnInvertCurve" + Me.btnInvertCurve.Size = New System.Drawing.Size(56, 48) + Me.btnInvertCurve.TabIndex = 31 + Me.btnInvertCurve.Text = "Invert" + Me.btnInvertCurve.TextAlign = System.Drawing.ContentAlignment.BottomCenter + Me.btnInvertCurve.UseVisualStyleBackColor = False + ' 'btnDelete ' Me.btnDelete.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control @@ -1015,7 +1200,7 @@ Partial Class Form1 Me.btnDelete.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnDelete.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnDelete.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnDelete.Image = Global.TestEIn.My.Resources.Resources.Delete + Me.btnDelete.Image = CType(resources.GetObject("btnDelete.Image"), System.Drawing.Image) Me.btnDelete.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnDelete.Location = New System.Drawing.Point(0, 0) Me.btnDelete.Name = "btnDelete" @@ -1045,7 +1230,7 @@ Partial Class Form1 Me.btnMirror.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnMirror.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnMirror.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnMirror.Image = Global.TestEIn.My.Resources.Resources.Mirror + Me.btnMirror.Image = CType(resources.GetObject("btnMirror.Image"), System.Drawing.Image) Me.btnMirror.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnMirror.Location = New System.Drawing.Point(0, 144) Me.btnMirror.Name = "btnMirror" @@ -1062,7 +1247,7 @@ Partial Class Form1 Me.btnCopy.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnCopy.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnCopy.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnCopy.Image = Global.TestEIn.My.Resources.Resources.Copy + Me.btnCopy.Image = CType(resources.GetObject("btnCopy.Image"), System.Drawing.Image) Me.btnCopy.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnCopy.Location = New System.Drawing.Point(0, 48) Me.btnCopy.Name = "btnCopy" @@ -1079,7 +1264,7 @@ Partial Class Form1 Me.btnRotate.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnRotate.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnRotate.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnRotate.Image = Global.TestEIn.My.Resources.Resources.Rotate + Me.btnRotate.Image = CType(resources.GetObject("btnRotate.Image"), System.Drawing.Image) Me.btnRotate.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnRotate.Location = New System.Drawing.Point(0, 96) Me.btnRotate.Name = "btnRotate" @@ -1096,7 +1281,7 @@ Partial Class Form1 Me.btnMove.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control Me.btnMove.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption Me.btnMove.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnMove.Image = Global.TestEIn.My.Resources.Resources.Move + Me.btnMove.Image = CType(resources.GetObject("btnMove.Image"), System.Drawing.Image) Me.btnMove.ImageAlign = System.Drawing.ContentAlignment.TopCenter Me.btnMove.Location = New System.Drawing.Point(0, 0) Me.btnMove.Name = "btnMove" @@ -1184,6 +1369,10 @@ Partial Class Form1 ' Me.ObjTreeTimer.Interval = 2000 ' + 'ColorDialog1 + ' + Me.ColorDialog1.AnyColor = True + ' 'Scene1 ' Me.Scene1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle @@ -1194,23 +1383,6 @@ Partial Class Form1 Me.Scene1.Size = New System.Drawing.Size(755, 425) Me.Scene1.TabIndex = 1 ' - 'btnInvertCurve - ' - Me.btnInvertCurve.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control - Me.btnInvertCurve.FlatAppearance.BorderSize = 0 - Me.btnInvertCurve.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.Control - Me.btnInvertCurve.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.GradientInactiveCaption - Me.btnInvertCurve.FlatStyle = System.Windows.Forms.FlatStyle.Flat - Me.btnInvertCurve.Image = Global.TestEIn.My.Resources.Resources.InvertCurve - Me.btnInvertCurve.ImageAlign = System.Drawing.ContentAlignment.TopCenter - Me.btnInvertCurve.Location = New System.Drawing.Point(0, 48) - Me.btnInvertCurve.Name = "btnInvertCurve" - Me.btnInvertCurve.Size = New System.Drawing.Size(56, 48) - Me.btnInvertCurve.TabIndex = 31 - Me.btnInvertCurve.Text = "Invert" - Me.btnInvertCurve.TextAlign = System.Drawing.ContentAlignment.BottomCenter - Me.btnInvertCurve.UseVisualStyleBackColor = False - ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -1244,6 +1416,8 @@ Partial Class Form1 Me.TableLayoutPanel3.PerformLayout() Me.Panel1.ResumeLayout(False) Me.Panel1.PerformLayout() + Me.InputBox.ResumeLayout(False) + Me.InputBox.PerformLayout() Me.TabControl2.ResumeLayout(False) Me.TabDraw.ResumeLayout(False) Me.TabConstruct.ResumeLayout(False) @@ -1328,5 +1502,15 @@ End Sub Friend WithEvents btnMirror As System.Windows.Forms.Button Friend WithEvents btnPlane As System.Windows.Forms.Button Friend WithEvents btnInvertCurve As System.Windows.Forms.Button + Friend WithEvents btnJoinCurve As System.Windows.Forms.Button + Friend WithEvents btnSplitCurve As System.Windows.Forms.Button + Friend WithEvents btnChangeColor As System.Windows.Forms.Button + Friend WithEvents btnExtrude As System.Windows.Forms.Button + Friend WithEvents InputBox As System.Windows.Forms.GroupBox + Friend WithEvents InputLabel As System.Windows.Forms.Label + Friend WithEvents InputCheck As System.Windows.Forms.CheckBox + Friend WithEvents InputText As System.Windows.Forms.TextBox + Friend WithEvents btnCircleCR As System.Windows.Forms.Button + Friend WithEvents btnRevolve As System.Windows.Forms.Button End Class diff --git a/Form1.resx b/Form1.resx index 0305069..c3fd425 100644 --- a/Form1.resx +++ b/Form1.resx @@ -121,6 +121,53 @@ 281, 10 + + + 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 + TjkNDp/6+Bcyg+r+/SotywAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KERcOFNvFs6IAAAFsSURBVFhH7dQ5T8NAEAVgL4e5TALhcriKKA2p + kJAQDR0NPcqvpqSn4neYeZs34HjWEiZmE0tE+lhppJ33tApJiqKYIx/8+QX37mXDG2/83AsxeWZgFv8U + Czj36guk4RImzwy4MDB3etIarZO/5wsACsBAgkvMXjNoq0BNCbPXDCoF5KMhaelUW2KbZgWS5GWuRJZP + vNFTH3Tv134zaKNAqAReokkBoU+8KRCGED1hR+yKPdJ7Y4ESUx+eUIoS+cTkmUE7BWA6wwIo07AAnhv0 + mRGiJ2S0T3qvhvsAk2cG35eWXmCD9JkRoif0RF8c0CHd1fB7TZ4ZrFABfOFAnxkhemrgoOSIjumE7um/ + QPcK4N8P9IuGED01sBx0SmeU0wN1rwB+akFDsExPNRTndEGXdEWP1L0CeHq4XhALNP8pXnqBW+KCRbk3 + MHlmsEIF/oTJM4PKhbaZvOogtuAwpuAwpuAwpuAwpuAwniL5BOxmy+3u6zjmAAAAAElFTkSuQmCC + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -150,6 +197,490 @@ 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 + AAAAAElFTkSuQmCC + + + + + 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 + klCOJJTjmNoZ0FXsKlnUK5MAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAAd0SU1FB94KEhQRIVDfaKgAAADQSURBVFhHxdDBDcIwEERRFwAV0hDV0EAO0JnR + HiaKnY8TxbvL4R34EniHUmv9K4xeyn15Ut/C6MEeL7flc3QExlnr46/34+gIjDOax2VwxC7M2C0/cUTz + YQYu78ERzY9cNVwuUf/A1eXr9ymeNbNcMJ4xu1wwHvFYLhhHvJYLxl88lwtG4r1cMPYilgvGrajlglEi + lwtGE71cOCYsl31IWi4cR0c4Pm4wGjzC+XGDUZojAh43GLfWIwIeNxh7UY8bjJkwZsKYCWMmjJkw5qnl + C3fdzWDzTa4mAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KEhUGDBFB2nwAAAGaSURBVFhHxZYxTsQwEEWnoKDjBlRUK1FxBZpt + OAX9HgE6zpCWCyBxBKQ0SByAgoKOZiW0QkKiMR7j8Y7H35tsNjLF0ybfY/+fiZMsOef+FSi2BIrToSO6 + el7R/YcreHEdmlMIU7mg7twaJU14/OKBMz0vHRwE3Z7+mXyysNRjtHhYZiGevr2sxvXJNEzb+58+G0/h + hLWjN7eS8W3hZOiYrl+7ZGDbTJcndPfeZyHUbYqLHILpwGCA2Tvg0SZ2txe3IN8n28IBeLLVxlBsQhMw + K67hqxZhsv9F41Vs+8G7IDupMS2A3hvl4ykUghBMNTGABs1LyL23j6UBikwwCekr7AwQrx603AJFJgWI + RnyMdIx/N9ysO3+QvXYRpcAGQjS1SAChrPEBus3g1TP5CS8M2LdmH0pBXVlt4WCq6lDNWKDISAAxkDBW + L9HfhvrjJ0CRSUY1YADwhwT8B9BAkQkBNNFUU84zX8bA7i5A0RIMYwA0vmXGDmjGB2Bm2gMWXtBqcwDF + lkCxJVBsCRRbAsWWQLElUGwJFNvh6Bf4WykDmLCLGQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAAd0SU1FB94KEhUJMle42xgAAADWSURBVFhH7ZFREoIwDER7WE/mFbiUt4hMMMza + bkrFuvz48TryEpItFjO7FCqVUKmESiVUKqFSCZVBWexW7g/bWZ9Z3zdwWS9mTArTipHlyECQXl8rkgWH + wTpBej3vD/US9sKJIL163riCtZpPgnRr8aNpJDdhHAbJeM1PB4Uf5UwQf28fgMXB22cMhWm+ABTDzQJn + O3BB2hRuFji7/rq0KdwssuVe86P6z7BhBtlyr/kBy7PGX7EdEACLCrbjH+DqAFdCpRIqlVCphEolVCqh + UgmVOqw8AVmOlhOdRMKIAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KEg8mDnt6uVQAAADnSURBVFhHxY6xccNAEMRYkx27HTfjQC1oXI1G + laiL95wS3RBgsBT5DpAgWOwyxvhXVM5E5RbL9fa5XO/fu/n6uWBzLbY4Ir77wFHxXQeOjMcHjo5HB86I + F+isxVOeFC/QgjgxXqAH8fsYbyHRDnoQNpog0Q56EDaaINEOehA2miDRDnoQNpog0Q56EDaaINEOehA2 + miDRDnoQNpog0Q56EDaaINEOehA2miDRF5cP9CBsNEHDBePPHoSNJgTxgsJGE4J4QWGjCUG8oLDRhCBe + UNhoQhAvVM5E5UxUzkTlTFTOROU8xvIHUjb6Nz+hLvkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KEhM2MZLi3CwAAAE7SURBVFhHxZZBbsJADEXnBiy75gqs2y5ZcTNU + 9chpbDHB9rdNxkHTxZPi5/H3CEREW5blX3HlTFwZ0T4ut/Z1/z0CZFoR8Y7lBORa4dFO5+uroAh7cehb + YVHLxbN31uJ9anDGColdzi4IsqhZcRE4Z0VH3f6xnH0QJBm5uCo22dqnDdh6QVBn9OKqYJEs534QxL1g + OfeCOVWw6AFHWC8S5YIHIYOK2EyZCx5EEkJk/UpPFSySECLrV3qqYJGEEFm/0lMFiySEyPqVnipYJCFE + 1q/0VMEiC1l/271fBTJBRAft8u+f5/MAkAvCOaiWO2/HzstZ7wUFwoTsXU5UZlGIkJHlRGUWhRjaEyCp + zKLogzsDJDDrfOcWFDakyo7lBAovbJT1P4XNjXDlTFw5E1fOxJUzceVMXDmPpf0BQxrD+wALxQUAAAAA + SUVORK5CYII= + + + + + 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 + vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp + vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L + Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA + bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z + llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW + ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s + xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6 + eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw + YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR + XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm + WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl + xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2 + dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8 + V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za + Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v + 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 + KUci5Tim8gPTBxi2aEwfcAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KEhA3IZQIQ1AAAAFnSURBVFhHxZY9TgNBDIXnBpTUXCENDT9dKs6R + SyBS0qCIK1DlMLnUgkfzVl4/2xomaCg+affz+L2VVtqkLMvyr7hyJq6MKLe7l/L48XkNlGlFxF+UC5Rr + hUe5udtT2Nfl0MXh/Kr3KNsKy6ZcX3tlFlMuUL4VGlteHe69Qo0uV9fUYQXYvPNWXj2cVwpsubh2rztq + nhVVlvKwBqjyOoO3pcArF5rTWTWPRFJe55jpUhCVC81THgkEXIMtn/4AtnzkAawHmGcl2YzySAQHAeZZ + STajPBLBQYB5VpLNKI9EcBBgnpVkM8ojERwEmGcl2YzySAQH60x/mgehTBLRQSl/Pr2vYU+nTXDK/fEN + 15RLwjm4lgvO1xGEu83L74ue1TkJE9JbLri7zUW7LFRIT4BmZJeFWuoJ0IzsssBiZ4CGdp13bmFhQ0bp + KBdYeGG/5ec/hc2NcOVMXDkTV87ElTNx5UxcOY+lfAM8Zk1oURwqJAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KEhA1H2dfPHkAAAE2SURBVFhH7ZY9DsIwDIVzA0ZmrsDMz8bEObgE + OwuquAITh+FSAUeN5fjZJS0QFoZPap7t96xWCoQY408xxZaYokeYL/dhfb68A3hqweMT4QT4asEizBa7 + V0YeenGoa0FThItnq1djvTXo0YJEhyfNMdIUs4fb0ZsrDpJi+z486Y6RBMKv94M3VxxYDGHFBiI81Ryj + TLF4Dh+zwFB4qjtGqeaFj1ogG7yDDm++gA6fsoDWM0P1XPsv8F/gawsUN9xEwBMEr5HCt92JzTZdYVwL + +IJgNHI4YdyOGQ6Sr178ENFNCTMg9M18rgwnOMgKd2ZR6AfSM4W/MJBwb2U4gYIYqjGQcH9lOIFCHqw0 + kMCs8c01KGiTqVSEEyhYZmN5/qfQvh6m2BJTbIkptsQUW2KKLTHFdsTwABCvlyeL6Od0AAAAAElFTkSu + QmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KEhA5IpOCP2QAAAF4SURBVFhHxZY7TgNBEETnBoTEXIGEhE9GxDl8 + CYRDEmRxBSIOw6WWndb2qrur2juzRkPwpO2arqrRWrJdpmn6V6g4EipmlOvbl/Lw8XkJkBmFjL8or0Bu + FBjl6uZ5KygjXhzOoxBx5Yfv1yyIwd4a7ETBAuVfP4csKOK85iKwFwXF3V7LGy/gyudn0RKfG1axlPs1 + wJY3XMBdfCkXPfG5QYRz5RsXyMrlLPG5QQQNuIT5Ilku6CDYoJ3ETJsLOggaFF+9kgRZb8+ZG0RYFml5 + JQmy3p4zN4iwLNLyShJkvT1nbhBhWaTllSTIenvO3CDCskjLK0mQ9facuUGEZZGWm9+CvUAfCLrMyp9O + 7+v548kFn+Xu+KbP0AeCmlh5JXzDWViJ+11gX1Ag6HJneUW962zLEy8KatDyjQCL7spzQ3kFBTV1llfs + fqsXBTU2BljASz7zCAoxZC8N5RUUWFgv83+KmJtBxZFQcSRUHAkVR0LFkVBxHFP5BW8gjs2z8kfIAAAA + AElFTkSuQmCC + + + + + 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 + IhSqNNwAAAAASUVORK5CYII= + + + + + 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 @@ -160,7 +691,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4 - DQAAAk1TRnQBSQFMAgEBDgEAARABBwEQAQcBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + DQAAAk1TRnQBSQFMAgEBDgEAAcgBCAHIAQgBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAAUADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -219,6 +750,251 @@ AaEBHQGAAQ8BwAEDAv8BsgFxAYABBwHAAQMB/gF/AXkBggGAAQMBwAEDAf4BfwFyARIBwAEBAcABAwH/ AT8BQAFyAeABAAHAAQMB/wGfARkBEgHwAQABwAEDAfkBnwGyAQ0B+AEAAcABAwH5AZ8BsgENAfwBAAHA AQMB/AE/AdsBGwH+AQABwAEDAv8C5wL/AcABAwL/AfgBHwr/Cw== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94LARAaLltR1e8AAAFASURBVFhHxZMLDsIgEEQ9WE/r6bxFZQjbzi5D + +cSgyUvK9O2A1b7O8/wrMmyRPkcCFy0ONfeEDBmU0gYzDB1GhgZKqHCF7iF02N/YFWNN9xTNg9RBu2zs + kU7O10E9CIY2N+DT7EX0gF/Ug1MbRzBPXbLPL7ycIi+v0Ou8L3787Q30UGfVyyJLKbolxaTbPARLUmiR + vfcn+/Eeg67LNWgPFu1GWtZFBntUlokuuLxI8b1YsEyRnYfCSM/3YsEyBXtWZEQXXF6k+F68+e9/AFje + YtIdegse39dV0EOdVW+UWUzRfW+VXqdf/PgpYJ66ZJ9b5MAPGNMHwQzNZ6ID6kAMFoYOAY9mGDlfBTls + lwBdtDADZGhgkEpW6D41GTIoocIZxn4yFbZAKW2gGNqUkeFOZLgTGe5EhjuR4U5kuI/z9QVrMm0Sw4U7 + uAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KHhUzLMLIh7oAAADnSURBVFhH7ZRREoMgDEQ9mKft6XoLmjATCMmq + rYbwU2bejD6BXbV2K6UsBcpMoMwEyqfQ2Ak+EHY0j4HyCRxWQ1/vzkkJJ+7QQgUdrkrYdYwT30LDPubO + zAI0joOF6AI0rkLb++Xj6ky4nqNxwnKy4fGmsuZiHgOlpm6gw1UJO/cOUGqWFqDhH39WgRYumHC+jtb9 + CpRMC8aEhDNY2rsPDLRgOYaT8nOiwHIsMO3uGSxVAXstGi8S3z8znkj4pE8OMZ7YcFVCz4tkPPkXWP0b + qEJKdPL/BzKBMhMoM4EyEygzgTKPsn0AWUzaGYkjGQMAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KFxErMsDdxdYAAAEESURBVFhHxZQLEoMgDEQ9mKft6XoLyjIGQ7JY + PxCZeTPlGbKx1i4ppVehMhIqI6HyKXmtGXwQVlYHqHwCwkro57tzMIQTd6ihgg5XQ9hzwImz5GW/5p2Z + A+TVDxZmDJDXUXB9vvhcnAnXNRonGLWphzf19fffAhxWjYRuw6tQqTHBYFg4oFJAmAoeHg6oBAhTwVPC + AZXAhGfF657CZdDdAy7b8Kx8zSi4bAeYdveASzWAvTYaLwY9f93DXtO0Gwk/+T9+RO1zcYA2XPjTRFN6 + CNtZwdaCdiOHLJ3DjKs92s2oAYTtrGBrQbt5+zdQhAyxE/cWvAGVkVAZCZWRUBkJlXGk5Qcz46N6J0RS + 8QAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KFxEsB9kvlzIAAACGSURBVFhH7dPRCYAwDABRB+u0TucWsRW0ogcR + keuPhQdyFJKPOkXEUBhNGE0YTRhNGE0YTRhNGE0Yn6inVO1jV+heBmOmDduGzkv3cgmMmdvw0xLXuxmM + mX+Besa+geZYovP+gi9hNGE0YTRhNGE0YTRhNGE0YTRhNGE0YTRhNGE0YfTEtAKYv7U6xFtRwAAAAABJ + RU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KFxElNy40HNcAAAD+SURBVFhHzdUBjsIgAERRD9bTejpvgf1G7ABD + S1tKNXnJMtv1E7ObfYQQbmXHHubXNOOLaLLPufEsYp/o87WoXCI59FLE5RLFs/nQw60XmF/lxz/qAr94 + lMX5fvEz+XAUb/6N1Fz3V8CbS0jZqLLjHkQkqDbjsGMrIhJUTXHYsQURCarmOOy4hYgE1a447LiGiATV + 7jjsWENEgupQHHZ0iEhQHY7DjjkiElSn4rCjIiJBdToOO0ZEJKi6xFEO9WjULY70EOPlf7GoaxzpIY+n + l+geR3pYuYA+11N6+IML1H4HLvn4UQ7xEovL4rDjSHYcyY4j2XEkO45kx3HC4w3Q1q4ttTanIgAAAABJ + RU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAAd0SU1FB94LAgkfLMlqd5cAAANkSURBVFhHxZRJTFNRFIZ/3bhw5UZ3JiYu2bnS + EE1coAsXxoVDHIhhKmChpRQBK5NDjGBMIC7UxJ1xpTHIQmOMUTFRawCRoGChyOQAgtSR4fX43w4E6yk0 + xjybfH3tf+89w33nHIjIf0UVUwPL4WgbhGd0s76eGqqYCshq7Ufhe0H2J0F+5wZtTyqo4lJgz43rKHgn + KBsXlH8W5I0J1jtXaHuXQhUXAxudW3CgJ+rYUPl1Gt6QwDMypu1fClVcDBx6LPDy2iu/CY6RmpnP8H2f + RQE1Z88h7cxiqGIysPNyLnKCdP5F4PspOD4jOBsOom5uHF7ehmuY2/SzyVDFZCDz3hQ8fO++H4KqWWIJ + mqQbDdKLo1MCB4uy4GWGdjYZqqiB1WlrsL9bUEFHxnl1mNdPLkoHeYZy3oqLxVjUd0c7nwxV1MDua0XI + G4i+92pmXkOxljTJG1yQdpSHLJQyAEeA23UbGqqowb6/Cedo9PpN5vEAzskozksPX8EcvB8FmX2CjPqV + mg0NVdRgAO3wsNJN9nUUTpITpEHGGMRANIAPgiwW6cHmdZoNDVWMk74Wq7Dr6hXsaw4i+zkHTrspMkHh + K9NyfN9vBMXMuLg/HHsKjgSoByZQ1PsAhV17NbsLUUUDtp50YNstZvNEkPOCTlmAzt6oQxezdLEeSoY5 + gDgRS5m5l91Rxhs6OsHfxM3/uVxzDUzS3DLNh0EX033bseM+s2GmxplnhEbpxIxe4+A3Ik4tVLAIK0Jh + wk4xsFvMpCxmYbqDIc2PQRf33uVVv2aGQ3RKA8aYqf7I8JmODiBD1ZyFOiuEBiuIRusl6q0Aaqwpjmcr + Oqono0Hn0E5+52HV1x9Cxqk07O7glTNzN6vazPlyVn4le/8Yq9+3gGoeOC3TaJQhXJJOPgOoDX9FGZ2X + 0LGbwbs4nByD5hV2JfqK+PtDONCyiUXUi5JBP6/Xz8z9qJrxc/D42XaJPGUntOKM3GU3tDCY22zTh7y1 + p/C+90coHfXD/baNBfko0VfEnybaiSraiSr+C/gxX/MkrsdRRUPsYA1J19ZTIXb+rwOYPxz7nVIgZl9s + /8KzXEqyXxPj8JNoLE4koBja+vyemB0+kvjQxEQWGFo0oMRzqaCKdqKKdqKKdqKKdqKKdqKKdqKK9iH4 + BcKd4KYRgNnpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KHwsOADT8SvgAAADkSURBVFhH7ZVBDoIwEEV7AI+Ep3PpwgOx8Wa1 + 0zh1Cq+B2mSIBpIXymOY/3eEGOOhoPQEpScoPUFJhOv9ES7zs0l6T99tgVJZhd7m2MTOdZRBKZRwCtui + owTLkXBlZwmWo+FK2kP7LSz/sUC6poQcpirLPhQpBUZLvHfkfZ9wpZRYhWep4d+WMN/nfe9Qey9ZerBU + wXJW1BE0l87VXhNc3FJk2QqzIUsa89Xe4QK9nAXOAr9b4Oi/oTBUYme4gFIpJRQKU+zcznABJbEqs6Qj + 1ILSE5SeoPQEpScoPUHpCUo/YngBJIdt0fK/TNMAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KHwsECi7GS2wAAAEYSURBVFhHxZRLDoMwDEQ5QI9ET9dlFz0Qm94s + zbNIFWKD8pOJ9Go8YM+gql1CCLdiip6Yoiem6IkpnhHPGuGiG7WzFM6IJ5mv1v0amFdaKVhgyjBV+uf7 + szy2bwv7nliK3aVQgimDVOmT+WsL1fQGwJQhqvQ95tATAFMGqNL3mkNrAEx5mCr9iDm0BMCUB6nSj5pD + Y4C55tAaQOosc+gKMMscbgvAjp18d86hEWFGgGQcv0Zr90FTwmiAwjie9KsSkv6/r4SRAJl5PLmx/Kos + tDAYYN9x+C+5Qgu9AY5vX2UOWhgIsM/L23NdgxbGA/BR9faghTxAI/l8LVpoXFAyJcAo5c4rTNETU/TE + FD0xRU9M0RNT9CMsP8YUDae/Iv6fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH + DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp + bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE + sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs + AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4 + JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR + 3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd + li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF + ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX + wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF + hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55 + 4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ + VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB + 5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC + qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE + j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I + 1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9 + rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG + fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp + B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ + yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC + YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln + yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v + vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp + vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L + Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA + bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z + llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW + ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s + xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6 + eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw + YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR + XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm + WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl + xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2 + dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8 + V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za + Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v + Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb + PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/ + 0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h + /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr + XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS + fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ + tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB94KHwkbEB16 + aOYAAAI8SURBVFhHzdLbTxNBGAXw49vOLn+KMV6JKDH+h77oA4kh8YbBIpaLbeldKDdRCV7inZhIoljQ + WlExMYzfmV1l3M5rh5L8kuE7mznfbgqt9YFyDn3i3yFX4EvHAvy/W+weq69zAf1AjkuJhqjFmJ1fg6Zz + D6EH78fOyDPMqA96IsLPHCk0ywrrDTL3Wj1WXy8usCjH2URF5GLMWExnZbkByalfnmFGEXbyET7USOH1 + gsKjVTL3Wj1Wn2OBuhyLiWkxHmM2uCBvLQbkmf5S7MTd/QUUNuohXixTgJXHCtU3ZO61eqy+XlygIMfJ + xJi4GWN2Wn4LdGoG+rjkdPS2vcDTlQhLzyhAeV1h8iOZe60eq8+xQFaOtxI3xNUYs5N5aDo2AX0kEzss + zzCjAPPPAxTfxe5sBhhpk7nX6rH6enCBbrF7rD7HF0A0atuDyhCzecxrqqMhv9HYFOb+fQHkNof+92nY + SPVYfT2+wG/0ZXcRzRCzmhRSQUqzmDVGBTPDLs83r6OwPW2keqy+zgX2EI79gpqiH1CVNsJlYpaTYhqX + 0hHcM4ZRtxaQt81vZYzS5yrKrTUj1WP19eACuwgL3xHOUQvh6jbUS2KWkUK6Ji6jZlwSzIyifO5Sa9Eo + f32FSnvLSPVYfZ0L8G2/IHhCTYRvm1DvidkVKaYhKb2YuIDq/gJ822prw6i1d1D7po1Uj9V3wAt0DP5e + 1AXpLtPnGvrkHPrkHPrkHPrkHPrkHPrkHPrkHPrkHPrkHPqj8QedywzpExYb4AAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KHhYtDVimFmIAAAC6SURBVFhH7Y9RDoMwDEM5GPe/VldLzcgSUxKY + so+10pPgFSdma639FCorodLSz97BAwN3O8tFoFIzFuiFZ9wqQaWAoWqBW4J3udM+A5VADx/QPzzzUbgM + LrdkvwdcHoNyw27kqASZIQK+HznhMk/lE7BUFbgs4UUwOANZNWc6ywsVtHcZ+vkoYe8FLwKhKP28S9g7 + wYsRmIW+iRerwCqwCqwCf1+gGiorobISKiuhshIqK6GyEirraNsL9oz5sY5cmbEAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KHhU0BlYy2KsAAADySURBVFhH7ZRrDoMwDIM5GKfd6XaLrs4ICanp + uqm0PwbSJwW3tb0HLCmlqVBxJFSM5GvNYGDEtZV5nEFFDwydOefxNN5acwkqKjDaDKmxaD7clfD7alAR + IEwCjOJTid6zAELEtIR+pbLWqwBCCsNKOKicqZ7z2BCNnKHuYSBIznI+lrABB34oEEGoeBnVEjZgc4cC + AKHiZ5z/jPugh0J47XCN3W8jrivHmy+at4Dz6hXXlFKw8Hx7XLuCUrgL3AX+ukC+ur4HWrBBwzu9CVux + IYa7ErrnCmy4C8z+D8iNljDGPQWzoOJIqDgSKo6EiuNIywvRuKZ6IkxttwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94LARYFGrMyU3YAAADiSURBVFhHxY/BDcIwDEUzACuxDdtwYAdW4MiF + cdjC6FcktqyfkiDHPTzJfXX13CIih0LlLOUhl3J/C/DvfkHlDDaefoCP45nt7UHlCCPxcnq+erQd+8Eo + o3/OwpW2Yz8YYTRuKefrLeSAqPhfB4TEzXPbsR/0iIpvfvaAyPj2buaA6DhDh2+kPSfEgQ7mgKw40MHE + suJABxtNigMdDogDHfwBhrpjiYgDHUi4UnfablAcULlHZBxQ2SM6DqhkrIgDKj2r4oBKz6o4oNKzKg6o + zITKTKjMhMpMqMyEykyozEPKB2+JEDSPq44pAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KFxAuHRe5Zv0AAAO2SURBVFhHxZbdT1tlHMc/rK2UUvoyyob0tIV2 + 7kLN/gMNxo0smOjVvNHpLgxTI84lZrqEyOKFcQoByZLFODEbRrdsMWbJ0Bn3JuWlpRQctoRJAesGlA1h + m8PoJMenJphafwVJTL34PDnn8/s+53nLOS26rv+viDKfiDKfiDLNSAU1cTevJMqoLcdaJmVWo5pq46yD + h5PraekwkaiBB7Mzf7tJswvMo1U0X9b4Iu7lg7iHlps+mtuLeVoFzNl5iTrqTMNmdv4SoKHTxuCTrDvM + 1JRLyv5D7Clix4Sb02OVtI542X/Fw6uKhvkATSPlfETNzg3ZfTIJG9k+o9E666PtDejloUe3SLllRFlJ + 4fYTJRy9FWDfVT97v/fSOO7jnaSPT2Y1hl6C6uw+bdQXXnHx8e3NnA86iT2BoS07IyHKNKqxquN4PeTg + 5M/3qcE9HPnBy1lFbMGL3mJm13K2z8i2SQ+6mvDdExbmMdq3Zj5rJUSZCc/WBw4WcnKqgljKTyzpZVpN + 4vcxC3qriWfCDpqCRvSREvRmA1d569Bm6Tm5EKVEBfatZ+3cnHWhxzSWQhXoPTb0S4pv1GRepqBbBZ1S + 35UQZS5UY3kB49vh9WrQcvQLii51vbeAM1L+3yDKlfjayCPBjegX72Wpz83dC+o6VIrOpqdsUn41RJmL + /hL2nS9Sq3bz03cayQ8tXJv2MdevdqLHxa8qZJX6rYQoJQbsvNulzrrXzY3JSuKNBYRUwdpkoH2+iuuD + TvROJ6elvishymwGnBzsU6tUW3573M/UIQMTqvDXl63RSHNK7UTcgb4btmX2XQ1RZhK1Uh/ysBhyMxfz + MneqmEV2778/O/eeiSM/VrIQ2bC2oxDlMv1mqiMaC2E3qahGqlut0IatVsqm+ayYr65p6MeKaJLqEqJM + Q9kO66TGuBp8Vq0+NezlTh2GDim7jGocERcziXvUW3G4xy1lshFlmtFSjl72/TmB5Lcerh8v5o4qlErZ + TLBvqZpWjz3u4JhUz0aUQawPjHkIqp/kaMTN5JDGYi2mPVJWos1Iw6j6PKsbu1TPRJRDJp6f8HFGveuh + qIeJsIvfePHAJikroRrjgIEbb0KdVM9ElL0lvDZexam4Rrfa/kRXKUu0f+6RsrlQ/wUeO7eOqFTLRJSD + Zp6b8fNpzM25hJ8x9YoNS7nVqCugU/KZ5JL2LhuRuQBfXnRyq4LiNX1c1oIo03DgfVcDdGzE8rhU/68Q + ZT4RZT4RZT4RZT4RZT4RZT4RZf7Q+QMgTr7iuQrsHAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KHQ4zNj1snb8AAACpSURBVFhH7Y7LCYAwEAVTgHXaiI2IbXjxbCV2 + sSZCJJ+XuAmyHtzAEJgE3hgi+hQoJYFSEii52GMv/MYFSi7/CTDDunkinwSY5SBP6GtAmXKNTyuxAuZ9 + 1IBXA+7xloCGCCg90XhrADMCSkc23hPAiMASjfcGPETkojTu6A1wFCJyoQEaoAEa4AIqRH9RQIXwrycT + LaQBPUDJRQM+D3gDKCWBUhIo5SBzAofF58BukbQYAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KGxYWLvGteBoAAADpSURBVFhH7ZRRDsMgDEN7gB160o7Vn92MYQoM + Upc2gNKPDekBcQD7p12cc7dCRUuoOMLyWN8MdhZQsYds9lod5SBIVfTSNJaIENVDPajME0WI3YNa/gGA + KkRhHu6WxQghRCtI7O/uSWGUHETAzgIqavADU0b2z6CiFj+etwUozMMq+2dQ8Sqleaz9ws8eQcUrwBSG + WFn/KlQ8Y5Y54CL5jEDuTzIHdZHM2I8EiCAz+G5axpKJIbZJY56YFGKbfj5A2GhCTDIHdYEQrSCxX94Z + hYspiICdHYWKllDREipaQkVLqGgJFe1wywchNgQ27oTpewAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAAd0SU1FB94KFQ05E0t1N8QAAADISURBVFhH7ZDdDcMgDAYzQEfqPFmki1RdIy99 + ziTdwsUoSIbPTcyPSCpR6QS5EnzKRESnguK2vPdIz9eCggc9FlIZAVcLcL+7w23jO3JAYQwIw3mV7+eC + whAghgeKI1AUfIFt9Xt5lwUUxgB/dhsu97zKM0egyAhIKYlAURHAhIjU/wJFZQDDARyi/ZeCok2A+Sug + aBDAjAArKC4RsMfrQ7VE8+TDEf6C5zpXMQJGwP8HNCC6Uz6cgSp7osqeqLInquyJKvtB0xf7GpRbxtg5 + LAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAAd0SU1FB94KFQ0xMVbM/CgAAADwSURBVFhH7Y7RDcMgDEQzQOfsHJW6SNU18tPv + TtItKCZAwbmQOFjOR4r0AJ8Nd4Nz7lCgaAkUexgu4wuBZgko7iGb3UcHWQhSFXtpGnNYiOqjPYjME0WI + 2YdS/gEIUYjCPLwtix5CiFaQ2J+940IvOQgDzRJQlOAXbRneXwOKUvy6HRagMA8n768Bxa2U5rH2B55d + AopbIFMypBP1twLFNbTMCSw+Pw6R+0rmRF0ks8f7CmFBNPhdWsYcxRDTJjFPKIWYttMHCBdJCCVzoi4o + RCtI7JdvesFiCsLgcxpA0RIoWgJFS6BoCRQtgaIdbvgCS/kFfmOvgmgAAAAASUVORK5CYII= diff --git a/Form1.vb b/Form1.vb index 2dc2001..28c9a2c 100644 --- a/Form1.vb +++ b/Form1.vb @@ -2,15 +2,16 @@ Imports System.Text Imports System.Math Imports System.IO +Imports System.Globalization Imports TestEIn.EgtInterface Imports TestEIn.GenInterface +Imports TestEIn.Controller Public Class Form1 Private m_sIniFile As String = String.Empty - Private m_sCurrFile As String = String.Empty - Private m_nMarkObj As Integer = GDB_ID.NULL + Private WithEvents m_Controller As New Controller '-------------------------------- Form ------------------------------------------------------------ Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load @@ -48,13 +49,11 @@ Public Class Form1 Scene1.SetMarkMaterial(MarkColor) ' imposto tipo e colore del rettangolo di zoom Dim bOutline As Boolean = True - Dim ZwColor As Color3d - ZwColor.Setup(0, 0, 0) + Dim ZwColor As New Color3d(0, 0, 0) GetPrivateProfileZoomWin("Scene", "ZoomWin", bOutline, ZwColor, m_sIniFile) Scene1.SetZoomWinAttribs(bOutline, ZwColor) ' imposto colore della linea di distanza - Dim DstLnColor As Color3d - DstLnColor.Setup(255, 0, 0) + Dim DstLnColor As New Color3d(255, 0, 0) GetPrivateProfileColor("Scene", "DistLine", DstLnColor, m_sIniFile) Scene1.SetDistLineMaterial(DstLnColor) ' imposto parametri OpenGL @@ -66,10 +65,20 @@ Public Class Form1 ' inizializzo scena Scene1.Init() ' imposto i dati della griglia - EgtSetGridShow(True, True) + Dim bShowGrid As Boolean = (GetPrivateProfileInt("Grid", "ShowGrid", 1, m_sIniFile) <> 0) + Dim bShowFrame As Boolean = (GetPrivateProfileInt("Grid", "ShowFrame", 1, m_sIniFile) <> 0) + Dim dSnapStep As Double = GetPrivateProfileDouble("Grid", "SnapStep", 10, m_sIniFile) + Dim nMinLineSStep As Integer = GetPrivateProfileInt("Grid", "MinLineSStep", 1, m_sIniFile) + Dim nMajLineSStep As Integer = GetPrivateProfileInt("Grid", "MajLineSStep", 10, m_sIniFile) + Dim nExtSStep As Integer = GetPrivateProfileInt("Grid", "ExtSStep", 50, m_sIniFile) + Dim MinLnColor As New Color3d(160, 160, 160) + GetPrivateProfileColor("Grid", "MinLnColor", MinLnColor, m_sIniFile) + Dim MajLnColor As New Color3d(160, 160, 160) + GetPrivateProfileColor("Grid", "MajLnColor", MajLnColor, m_sIniFile) + EgtSetGridShow(bShowGrid, bShowFrame) EgtSetGridFrame(Frame3d.GLOB) - EgtSetGridGeo(10, 1, 10, 50) - EgtSetGridColor(New Color3d(160, 160, 160), New Color3d(160, 160, 160)) + EgtSetGridGeo(dSnapStep, nMinLineSStep, nMajLineSStep, nExtSStep) + EgtSetGridColor(MinLnColor, MajLnColor) ' modo di visualizzazione Dim nShowMode As Integer = GetPrivateProfileInt("Scene", "ShowMode", SM.SHADING, m_sIniFile) If nShowMode = SM.WIREFRAME Then @@ -103,6 +112,8 @@ Public Class Form1 Me.Size = New Size(nWidth, nHeight) WindowState = IIf(nFlag = 1, FormWindowState.Maximized, FormWindowState.Normal) End If + ' Impostazioni controller + m_Controller.SetScene(Scene1) ' Recupero eventuali parametri da linea di comando Dim bOpen As Boolean = False For Each s As String In My.Application.CommandLineArgs @@ -123,13 +134,13 @@ Public Class Form1 End If Next If Not bOpen Then - Scene1.NewProject() + Scene1.NewProject(True) End If End Sub Private Sub Form1_FormClosing(sender As System.Object, e As FormClosingEventArgs) Handles MyBase.FormClosing ' gestisco eventuale file corrente modificato - If Not ManageModified() Then + If Not m_Controller.ManageModified() Then e.Cancel = True Return End If @@ -178,10 +189,11 @@ Public Class Form1 End Sub Private Sub OnNewProject(ByVal sender As Object) Handles Scene1.OnNewProject - m_sCurrFile = String.Empty - ResetModified() + m_Controller.ResetCurrFile() + m_Controller.ResetModified() + m_Controller.ExecuteCommand(CMD.RESETCURRPARTLAYER) EmitTitle() - ResetCurrPartLayer() + EmitCurrPartLayer() LoadObjTree() End Sub @@ -190,26 +202,23 @@ Public Class Form1 End Sub Private Sub OnOpenProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnOpenProject - m_sCurrFile = sFile - ResetModified() + m_Controller.SetCurrFile(sFile) + m_Controller.ResetModified() + m_Controller.ExecuteCommand(CMD.RESETCURRPARTLAYER) EmitTitle() - WritePrivateProfileString("General", "LastNgeDir", Path.GetDirectoryName(m_sCurrFile), m_sIniFile) - ResetCurrPartLayer() + EmitCurrPartLayer() LoadObjTree() + WritePrivateProfileString("General", "LastNgeDir", Path.GetDirectoryName(sFile), m_sIniFile) End Sub Private Sub OnSavingProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnSavingProject - m_sCurrFile = sFile + m_Controller.SetCurrFile(sFile) EmitTitle() - WritePrivateProfileString("General", "LastNgeDir", Path.GetDirectoryName(m_sCurrFile), m_sIniFile) - ' ripristino stato eventuale oggetto marcato - m_nMarkObj = RevertOldIdInObjTree() + WritePrivateProfileString("General", "LastNgeDir", Path.GetDirectoryName(sFile), m_sIniFile) End Sub Private Sub OnSavedProject(ByVal sender As Object) Handles Scene1.OnSavedProject - ResetModified() - ' rimarco eventuale oggetto smarcato - SelectIdInObjTree(m_nMarkObj) + m_Controller.ResetModified() End Sub Private Sub OnImportingProject(ByVal sender As Object) Handles Scene1.OnImportingProject @@ -217,23 +226,20 @@ Public Class Form1 End Sub Private Sub OnImportedProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnImportedProject - WritePrivateProfileString("General", "LastImpDir", Path.GetDirectoryName(sFile), m_sIniFile) - m_sCurrFile = sFile - SetModified() + m_Controller.SetCurrFile(sFile) + m_Controller.SetModified() + m_Controller.ExecuteCommand(CMD.RESETCURRPARTLAYER) EmitTitle() - ResetCurrPartLayer() + EmitCurrPartLayer() LoadObjTree() + WritePrivateProfileString("General", "LastImpDir", Path.GetDirectoryName(sFile), m_sIniFile) End Sub Private Sub OnExportingProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnExportingProject WritePrivateProfileString("General", "LastExpDir", Path.GetDirectoryName(sFile), m_sIniFile) - ' ripristino stato eventuale oggetto marcato - m_nMarkObj = RevertOldIdInObjTree() End Sub Private Sub OnExportedProject(ByVal sender As Object) Handles Scene1.OnExportedProject - ' rimarco eventuale oggetto smarcato - SelectIdInObjTree(m_nMarkObj) End Sub Private Sub OnExecutingScript(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnExecutingScript @@ -242,23 +248,52 @@ Public Class Form1 End Sub Private Sub OnExecutedScript(ByVal sender As Object) Handles Scene1.OnExecutedScript - SetModified() + m_Controller.SetModified() + LoadObjTree() + End Sub + + Private Sub OnMouseSelectedPoint(ByVal sender As Object, ByVal PtP As Point3d) Handles Scene1.OnMouseSelectedPoint + m_Controller.SetLastPoint3d(PtP) + If (ModifierKeys And Keys.Control) <> Keys.Control Then + m_Controller.GoToNextStatus() + Else + ' eseguo ultimo drag + m_Controller.SetLastPoint3d(PtP) + m_Controller.ExecuteDrag() + ' passo in modalità input da box + Scene1.DisableDrag() + SetInputBoxPoint3d(PtP) + End If + End Sub + + Private Sub OnMouseMoveSelPoint(ByVal sender As Object, ByVal PtP As Point3d) Handles Scene1.OnMouseMoveSelPoint + m_Controller.SetLastPoint3d(PtP) + m_Controller.ExecuteDrag() + End Sub + + Private Sub OnSetInputBox(ByVal sTitle As String, ByVal sLabel As String, ByVal nType As IBT) Handles m_Controller.SetInputBox + SetInputBox(sTitle, sLabel, nType) + End Sub + + Private Sub OnUpdateUI(ByVal sender) Handles m_Controller.UpdateUI + ResetInputBox() + ToolStripStatusOutput.Text = "" LoadObjTree() End Sub '-------------------------------- Buttons -------------------------------------------------------- Private Sub btnNew_Click(sender As System.Object, e As System.EventArgs) Handles btnNew.Click ' gestisco eventuale file corrente modificato - If Not ManageModified() Then + If Not m_Controller.ManageModified() Then Return End If ' eseguo - Scene1.NewProject() + Scene1.NewProject(True) End Sub Private Sub btnOpen_Click(sender As System.Object, e As System.EventArgs) Handles btnOpen.Click ' gestisco eventuale file corrente modificato - If Not ManageModified() Then + If Not m_Controller.ManageModified() Then Return End If ' eseguo @@ -268,16 +303,16 @@ Public Class Form1 End Sub Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click - Scene1.SaveProject(m_sCurrFile) + Scene1.SaveProject(m_Controller.GetCurrFile()) End Sub Private Sub btnSaveAs_Click(sender As System.Object, e As System.EventArgs) Handles btnSaveAs.Click - Scene1.SaveAsProject(m_sCurrFile) + Scene1.SaveAsProject(m_Controller.GetCurrFile()) End Sub Private Sub btnImport_Click(sender As System.Object, e As System.EventArgs) Handles btnImport.Click ' gestisco eventuale file corrente modificato - If Not ManageModified() Then + If Not m_Controller.ManageModified() Then Return End If ' eseguo @@ -287,7 +322,7 @@ Public Class Form1 End Sub Private Sub btnExport_Click(sender As System.Object, e As System.EventArgs) Handles btnExport.Click - Scene1.ExportProject(Path.ChangeExtension(m_sCurrFile, "dxf")) + Scene1.ExportProject(Path.ChangeExtension(m_Controller.GetCurrFile(), "dxf")) End Sub Private Sub btnExec_Click(sender As System.Object, e As System.EventArgs) Handles btnExec.Click @@ -381,7 +416,114 @@ Public Class Form1 Scene1.IsoViewNW() End Sub - ' ----------------- Test ------------------- + ' --------------------- Update UI ------------------------------- + Private Sub Application_Idle(ByVal sender As Object, ByVal e As EventArgs) + ' Gestione abilitazione bottoni + Dim bLayerOk As Boolean = (m_Controller.GetCurrLayer() <> GDB_ID.NULL) + Dim bSelOk As Boolean = (EgtGetFirstSelectedObj() <> GDB_ID.NULL) + ' Draw + btnPoint.Enabled = bLayerOk + btnLine2P.Enabled = bLayerOk + btnCircleCR.Enabled = bLayerOk + btnArcCSE.Enabled = bLayerOk + btnArc3P.Enabled = bLayerOk + ' Construct + btnPlane.Enabled = bLayerOk And bSelOk + btnExtrude.Enabled = bLayerOk And bSelOk + btnRevolve.Enabled = bLayerOk And bSelOk + ' Edit + btnDelete.Enabled = bSelOk + btnChangeColor.Enabled = bSelOk + btnInvertCurve.Enabled = bSelOk + btnJoinCurve.Enabled = bLayerOk And bSelOk + btnSplitCurve.Enabled = bSelOk + ' Transform + btnCopy.Enabled = bSelOk + btnMove.Enabled = bSelOk + btnRotate.Enabled = bSelOk + btnMirror.Enabled = bSelOk + End Sub + + + ' --------------------- Commands -------------------------------- + Private Sub btnPoint_Click(sender As System.Object, e As System.EventArgs) Handles btnPoint.Click + m_Controller.ExecuteCommand(CMD.POINT) + End Sub + + Private Sub btnLine2P_Click(sender As System.Object, e As System.EventArgs) Handles btnLine2P.Click + m_Controller.ExecuteCommand(CMD.LINE2P) + End Sub + + Private Sub btnCircleCR_Click(sender As System.Object, e As System.EventArgs) Handles btnCircleCR.Click + m_Controller.ExecuteCommand(CMD.CIRCLECR) + End Sub + + Private Sub btnArcCSE_Click(sender As System.Object, e As System.EventArgs) Handles btnArcCSE.Click + m_Controller.ExecuteCommand(CMD.ARCCSE) + End Sub + + Private Sub btnArc3P_Click(sender As System.Object, e As System.EventArgs) Handles btnArc3P.Click + m_Controller.ExecuteCommand(CMD.ARC3P) + End Sub + + Private Sub btnPlane_Click(sender As System.Object, e As System.EventArgs) Handles btnPlane.Click + m_Controller.ExecuteCommand(CMD.PLANE) + End Sub + + Private Sub btnExtrude_Click(sender As System.Object, e As System.EventArgs) Handles btnExtrude.Click + m_Controller.ExecuteCommand(CMD.EXTRUDE) + End Sub + + Private Sub btnRevolve_Click(sender As System.Object, e As System.EventArgs) Handles btnRevolve.Click + m_Controller.ExecuteCommand(CMD.REVOLVE) + End Sub + + Private Sub btnDelete_Click(sender As System.Object, e As System.EventArgs) Handles btnDelete.Click + m_Controller.ExecuteCommand(CMD.DELETE) + End Sub + + Private Sub btnChangeColor_Click(sender As System.Object, e As System.EventArgs) Handles btnChangeColor.Click + If (ModifierKeys And Keys.Shift) <> Keys.Shift Then + m_Controller.ExecuteCommand(CMD.CHANGECOLOR) + Else + m_Controller.ExecuteCommand(CMD.RESETCOLOR) + End If + End Sub + + Private Sub btnInvertCurve_Click(sender As System.Object, e As System.EventArgs) Handles btnInvertCurve.Click + m_Controller.ExecuteCommand(CMD.INVERTCRVSURF) + End Sub + + Private Sub btnJoinCurve_Click(sender As System.Object, e As System.EventArgs) Handles btnJoinCurve.Click + m_Controller.ExecuteCommand(CMD.JOINCURVE) + End Sub + + Private Sub btnSplitCurve_Click(sender As System.Object, e As System.EventArgs) Handles btnSplitCurve.Click + m_Controller.ExecuteCommand(CMD.SPLITCURVE) + End Sub + + Private Sub btnMove_Click(sender As System.Object, e As System.EventArgs) Handles btnMove.Click + m_Controller.ExecuteCommand(CMD.MOVE) + End Sub + + Private Sub btnCopy_Click(sender As System.Object, e As System.EventArgs) Handles btnCopy.Click + m_Controller.ExecuteCommand(CMD.COPY) + End Sub + + Private Sub btnRotate_Click(sender As System.Object, e As System.EventArgs) Handles btnRotate.Click + If (ModifierKeys And Keys.Shift) <> Keys.Shift Then + m_Controller.ExecuteCommand(CMD.ROTATE) + Else + m_Controller.ExecuteCommand(CMD.ROTATE3D) + End If + End Sub + + Private Sub btnMirror_Click(sender As System.Object, e As System.EventArgs) Handles btnMirror.Click + m_Controller.ExecuteCommand(CMD.MIRROR) + End Sub + + + ' ----------------- Test Commands ------------------- Private Sub XbtnRotP90_Click(sender As System.Object, e As System.EventArgs) Handles XbtnRotP90.Click XRotate(90) ' aggiorno visualizzazione @@ -448,531 +590,130 @@ Public Class Form1 End While End Sub - ' --------------------- Update UI ------------------------------- - Private Sub Application_Idle(ByVal sender As Object, ByVal e As EventArgs) - Dim bLayerOk As Boolean = (GetCurrLayer() <> GDB_ID.NULL) - Dim bSelOk As Boolean = (EgtGetFirstSelectedObj() <> GDB_ID.NULL) - ' Draw - btnPoint.Enabled = bLayerOk - btnLine2P.Enabled = bLayerOk - btnArcCSE.Enabled = bLayerOk - btnArc3P.Enabled = bLayerOk - ' Construct - btnPlane.Enabled = bLayerOk And bSelOk - ' Edit - btnDelete.Enabled = bSelOk - btnInvertCurve.Enabled = bSelOk - ' Transform - btnCopy.Enabled = bSelOk - btnMove.Enabled = bSelOk - btnRotate.Enabled = bSelOk - btnMirror.Enabled = bSelOk - - End Sub - - ' --------------------- Commands -------------------------------- - Private Enum EST As Integer - NULL = 0 - POINT - LINE2P_1 - LINE2P_2 - ARCCSE_1 - ARCCSE_2 - ARCCSE_3 - ARC3P_1 - ARC3P_2 - ARC3P_3 - MOVE_1 - MOVE_2 - COPY_1 - COPY_2 - ROTATE_1 - ROTATE_2 - ROTATE_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 Sub btnPoint_Click(sender As System.Object, e As System.EventArgs) Handles btnPoint.Click - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' posso partire solo se esiste un gruppo corrente - If GetCurrLayer() = GDB_ID.NULL Then - Return - End If - ' non serve il gruppo di drag - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per point - m_nStatus = EST.POINT - ToolStripStatusOutput.Text = "Point : select Point" - End Sub - - Private Sub btnLine2P_Click(sender As System.Object, e As System.EventArgs) Handles btnLine2P.Click - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' posso partire solo se esiste un gruppo corrente - If GetCurrLayer() = GDB_ID.NULL Then - Return - End If - ' creo il gruppo di drag - If Not Scene1.CreateDragGroup() Then - Return - End If - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per Line2P - m_nStatus = EST.LINE2P_1 - ToolStripStatusOutput.Text = "Line : select Start Point" - End Sub - - Private Sub btnArcCSE_Click(sender As System.Object, e As System.EventArgs) Handles btnArcCSE.Click - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' posso partire solo se esiste un gruppo corrente - If GetCurrLayer() = GDB_ID.NULL Then - Return - End If - ' creo il gruppo di drag - If Not Scene1.CreateDragGroup() Then - Return - End If - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per ArcCSE - m_nStatus = EST.ARCCSE_1 - ToolStripStatusOutput.Text = "Arc : select Center" - End Sub - - Private Sub btnArc3P_Click(sender As System.Object, e As System.EventArgs) Handles btnArc3P.Click - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' posso partire solo se esiste un gruppo corrente - If GetCurrLayer() = GDB_ID.NULL Then - Return - End If - ' creo il gruppo di drag - If Not Scene1.CreateDragGroup() Then - Return - End If - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per Arc3P - m_nStatus = EST.ARC3P_1 - ToolStripStatusOutput.Text = "Arc : select Start Point" - End Sub - - Private Sub btnPlane_Click(sender As System.Object, e As System.EventArgs) Handles btnPlane.Click - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' posso partire solo se esiste un gruppo corrente - If GetCurrLayer() = GDB_ID.NULL Then - Return - End If - ' creo la superficie - EgtCreateSurfTriMeshByContour(GetCurrLayer(), EgtGetFirstSelectedObj(), 10 * EPS_SMALL) - EgtDeselectAll() - ' reset stato scena - Scene1.ResetStatus() - ' reset stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - End Sub - - Private Sub btnDelete_Click(sender As System.Object, e As System.EventArgs) Handles btnDelete.Click - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' lancio la cancellazione - EgtErase(GDB_ID.SEL) - ' reset stato scena - Scene1.ResetStatus() - ' reset stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - End Sub - - Private Sub btnInvertCurve_Click(sender As System.Object, e As System.EventArgs) Handles btnInvertCurve.Click - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' lancio l'inversione della curva - EgtInvertCurve(EgtGetFirstSelectedObj()) - EgtDeselectAll() - ' reset stato scena - Scene1.ResetStatus() - ' reset stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - End Sub - - Private Sub btnMove_Click(sender As System.Object, e As System.EventArgs) Handles btnMove.Click - ' verifico condizioni e preparo per il drag - If Not PrepareTransform() Then - Return - End If - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per Move - m_nStatus = EST.MOVE_1 - ToolStripStatusOutput.Text = "Move : select Base Point" - End Sub - - Private Sub btnCopy_Click(sender As System.Object, e As System.EventArgs) Handles btnCopy.Click - ' verifico condizioni e preparo per il drag - If Not PrepareTransform() Then - Return - End If - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per Move - m_nStatus = EST.COPY_1 - ToolStripStatusOutput.Text = "Copy : select Base Point" - End Sub - - Private Sub btnRotate_Click(sender As System.Object, e As System.EventArgs) Handles btnRotate.Click - ' verifico condizioni e preparo per il drag - If Not PrepareTransform() Then - Return - End If - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per Rotate - m_nStatus = EST.ROTATE_1 - ToolStripStatusOutput.Text = "Rotate : select Center" - End Sub - - Private Sub btnMirror_Click(sender As System.Object, e As System.EventArgs) Handles btnMirror.Click - ' verifico condizioni e preparo per il drag - If Not PrepareTransform() Then - Return - End If - ' imposto stato di scena a selezione punto - Scene1.SetStatusSelPoint() - ' imposto stato a primo punto per Mirror - m_nStatus = EST.MIRROR_1 - ToolStripStatusOutput.Text = "Rotate : select Start Point" - End Sub - - 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 Scene1.CreateDragGroup() Then - Return False - End If - Dim nId As Integer = EgtGetFirstSelectedObj() - While nId <> GDB_ID.NULL - If Not Scene1.AddToDragGroup(nId) Then - Scene1.EraseDragGroup() - Return False - End If - nId = EgtGetNextSelectedObj() - End While - Return True - End Function - - Private Sub OnMouseSelectedPoint(ByVal sender As Object, ByVal PtP As Point3d) Handles Scene1.OnMouseSelectedPoint - ' Point - If m_nStatus = EST.POINT Then - ' creo il punto (i dati sono in globale) - EgtCreateGeoPoint(GetCurrLayer(), PtP.Loc(GetCurrLayer())) - ' reset stato scena - Scene1.ResetStatus() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - ' Line2P - ElseIf m_nStatus = EST.LINE2P_1 Then - m_ptP1 = PtP - m_nStatus = EST.LINE2P_2 - ToolStripStatusOutput.Text = "Line : select End Point" - ElseIf m_nStatus = EST.LINE2P_2 Then - ' reset scena - Scene1.ResetStatus(False) - ' creo la linea (i punti sono in globale) - EgtCreateCurveLine(GetCurrLayer(), m_ptP1.Loc(GetCurrLayer()), PtP.Loc(GetCurrLayer())) - EgtDraw() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - ' Arc3P - ElseIf m_nStatus = EST.ARC3P_1 Then - m_ptP1 = PtP - m_nStatus = EST.ARC3P_2 - ToolStripStatusOutput.Text = "Arc : select End Point" - ElseIf m_nStatus = EST.ARC3P_2 Then - m_ptP2 = PtP - m_nStatus = EST.ARC3P_3 - ToolStripStatusOutput.Text = "Arc : select Mid Point" - ElseIf m_nStatus = EST.ARC3P_3 Then - ' reset scena - Scene1.ResetStatus() - ' creo l'arco (i punti sono in globale) - EgtCreateCurveArc3P(GetCurrLayer(), m_ptP1.Loc(GetCurrLayer()), PtP.Loc(GetCurrLayer()), m_ptP2.Loc(GetCurrLayer())) - EgtDraw() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - ' ArcCSE - ElseIf m_nStatus = EST.ARCCSE_1 Then - m_ptP1 = PtP - m_nStatus = EST.ARCCSE_2 - ToolStripStatusOutput.Text = "Arc : select Start Point" - ElseIf m_nStatus = EST.ARCCSE_2 Then - m_ptP2 = PtP - m_nStatus = EST.ARCCSE_3 - ToolStripStatusOutput.Text = "Arc : select End (near) Point" - ElseIf m_nStatus = EST.ARCCSE_3 Then - ' reset scena - Scene1.ResetStatus() - ' creo l'arco (i punti sono in globale) - EgtCreateCurveArcC2PN(GetCurrLayer(), m_ptP1.Loc(GetCurrLayer()), m_ptP2.Loc(GetCurrLayer()), PtP.Loc(GetCurrLayer()), EgtGetGridVersZ()) - EgtDraw() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - ' Move - ElseIf m_nStatus = EST.MOVE_1 Then - m_ptP1 = PtP - m_nStatus = EST.MOVE_2 - ToolStripStatusOutput.Text = "Move : select Target Point" - ElseIf m_nStatus = EST.MOVE_2 Then - ' eseguo movimento - EgtMoveGlob(GDB_ID.SEL, (PtP - m_ptP1)) - EgtDeselectAll() - ' reset stato scena - Scene1.ResetStatus() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - ' Copy - ElseIf m_nStatus = EST.COPY_1 Then - m_ptP1 = PtP - m_nStatus = EST.COPY_2 - ToolStripStatusOutput.Text = "Copy : select Target Point" - ElseIf m_nStatus = EST.COPY_2 Then - ' reset scena - Scene1.ResetStatus() - ' eseguo copia e movimento - Dim nId As Integer = EgtGetFirstSelectedObj() - While nId <> GDB_ID.NULL - Dim nCopyId As Integer = EgtCopyGlob(nId, GetCurrLayer()) - EgtMoveGlob(nCopyId, (PtP - m_ptP1)) - nId = EgtGetNextSelectedObj() - End While - EgtDeselectAll() - EgtDraw() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - ' Rotate - ElseIf m_nStatus = EST.ROTATE_1 Then - m_ptP1 = PtP - m_nStatus = EST.ROTATE_2 - ToolStripStatusOutput.Text = "Rotate : select Base Point" - ElseIf m_nStatus = EST.ROTATE_2 Then - m_ptP2 = PtP - m_nStatus = EST.ROTATE_3 - ToolStripStatusOutput.Text = "Rotate : select Rotation Point" - ElseIf m_nStatus = EST.ROTATE_3 Then - ' eseguo rotazione - Dim dAngRotDeg As Double = 0 - Dim bDet As Boolean = True - EgtGetVectorRotation((m_ptP2 - m_ptP1), (PtP - m_ptP1), EgtGetGridVersZ(), dAngRotDeg, bDet) - EgtRotateGlob(GDB_ID.SEL, m_ptP1, EgtGetGridVersZ(), dAngRotDeg) - EgtDeselectAll() - ' reset stato scena - Scene1.ResetStatus() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - ' Mirror - ElseIf m_nStatus = EST.MIRROR_1 Then - m_ptP1 = PtP - m_ptP2 = m_ptP1 - m_nStatus = EST.MIRROR_2 - ToolStripStatusOutput.Text = "Mirror : select End Point" - ElseIf m_nStatus = EST.MIRROR_2 Then - ' eseguo mirror - Dim VtNorm As Vector3d = (PtP - m_ptP1) ^ EgtGetGridVersZ() - If VtNorm.Len > EPS_SMALL Then - EgtMirrorGlob(GDB_ID.SEL, m_ptP1, VtNorm) - End If - EgtDeselectAll() - ' reset stato scena - Scene1.ResetStatus() - ' aggiorno stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - SetModified() - LoadObjTree() - End If - End Sub - - Private Sub OnMouseMoveSelPoint(ByVal sender As Object, ByVal PtP As Point3d) Handles Scene1.OnMouseMoveSelPoint - If m_nStatus = EST.LINE2P_2 Then - ' durante la creazione di oggetti il gruppo di Drag ha riferimento globale - Dim nId As Integer = EgtGetFirstInGroup(Scene1.GetDragGroup()) - If nId = GDB_ID.NULL Then - EgtCreateCurveLine(Scene1.GetDragGroup(), m_ptP1, PtP) - Else - EgtModifyCurveEndPoint(nId, PtP) - End If - EgtDraw() - ElseIf m_nStatus = EST.ARC3P_2 Or m_nStatus = EST.ARCCSE_2 Then - ' durante la creazione di oggetti il gruppo di Drag ha riferimento globale - Dim nId As Integer = EgtGetFirstInGroup(Scene1.GetDragGroup()) - If nId = GDB_ID.NULL Then - EgtCreateCurveLine(Scene1.GetDragGroup(), m_ptP1, PtP) - Else - EgtModifyCurveEndPoint(nId, PtP) - End If - EgtDraw() - ElseIf m_nStatus = EST.ARC3P_3 Then - ' durante la creazione di oggetti il gruppo di Drag ha riferimento globale - Dim nId As Integer = EgtGetFirstInGroup(Scene1.GetDragGroup()) - If EgtGetType(nId) <> TY.CRV_ARC Then - EgtErase(nId) - nId = GDB_ID.NULL - End If - If nId = GDB_ID.NULL Then - EgtCreateCurveArc3P(Scene1.GetDragGroup(), m_ptP1, PtP, m_ptP2) - Else - EgtModifyCurveArc3P(nId, PtP) - End If - EgtDraw() - ElseIf m_nStatus = EST.ARCCSE_3 Then - ' durante la creazione di oggetti il gruppo di Drag ha riferimento globale - Dim nId As Integer = EgtGetFirstInGroup(Scene1.GetDragGroup()) - If EgtGetType(nId) <> TY.CRV_ARC Then - EgtErase(nId) - nId = GDB_ID.NULL - End If - If nId = GDB_ID.NULL Then - Dim vtN As New Vector3d(0, 0, 1) - EgtCreateCurveArcC2PN(Scene1.GetDragGroup(), m_ptP1, m_ptP2, PtP, vtN.Glob(GetCurrLayer())) - Else - EgtModifyCurveArcC2PN(nId, PtP) - End If - EgtDraw() - ElseIf m_nStatus = EST.MOVE_2 Then - ' ripristino lo stato iniziale - EgtChangeGroupFrame(Scene1.GetDragGroup(), Frame3d.GLOB) - ' eseguo tutto il movimento - EgtMoveGlob(Scene1.GetDragGroup(), (PtP - m_ptP1)) - EgtSetGeoLine(m_ptP1, PtP) - EgtDraw() - ElseIf m_nStatus = EST.COPY_2 Then - ' ripristino lo stato iniziale - EgtChangeGroupFrame(Scene1.GetDragGroup(), Frame3d.GLOB) - ' eseguo tutto il movimento - EgtMoveGlob(Scene1.GetDragGroup(), (PtP - m_ptP1)) - EgtSetGeoLine(m_ptP1, PtP) - EgtDraw() - ElseIf m_nStatus = EST.ROTATE_3 Then - ' ripristino lo stato iniziale - EgtChangeGroupFrame(Scene1.GetDragGroup(), Frame3d.GLOB) - ' eseguo rotazione - Dim dAngRotDeg As Double = 0 - Dim bDet As Boolean = True - EgtGetVectorRotation((m_ptP2 - m_ptP1), (PtP - m_ptP1), EgtGetGridVersZ(), dAngRotDeg, bDet) - EgtRotateGlob(Scene1.GetDragGroup(), m_ptP1, EgtGetGridVersZ(), dAngRotDeg) - EgtDraw() - ElseIf m_nStatus = EST.MIRROR_2 Then - ' ripristino lo stato iniziale, tramite annullo mirror precedente - Dim VtNorm As Vector3d = (m_ptP2 - m_ptP1) ^ EgtGetGridVersZ() - If VtNorm.Len > EPS_SMALL Then - EgtMirrorGlob(Scene1.GetDragGroup(), m_ptP1, VtNorm) - End If - ' eseguo mirror - VtNorm = (PtP - m_ptP1) ^ EgtGetGridVersZ() - If VtNorm.Len > EPS_SMALL Then - EgtMirrorGlob(Scene1.GetDragGroup(), m_ptP1, VtNorm) - End If - ' salvo il punto - m_ptP2 = PtP - EgtDraw() - End If - End Sub - '-------------------------------- KeyDown -------------------------------------------------------- Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown ' Con ESC esco dall'azione corrente If e.KeyData = Keys.Escape Then ' reset Azione corrente - m_nStatus = EST.NULL - Scene1.ResetStatus() + m_Controller.ResetStatus() ' reset Analisi e Distanza chkAnalyze.Checked = False chkGetDist.Checked = False ' pulisco output ToolStripStatusOutput.Text = "" + ResetInputBox() End If End Sub Private Sub Scene1_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles Scene1.KeyDown ' Con DEL eseguo cancellazione delle entità selezionate If e.KeyData = Keys.Delete Then - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' lancio la cancellazione - If EgtGetFirstSelectedObj() <> GDB_ID.NULL Then - EgtErase(GDB_ID.SEL) - SetModified() - ' reset stato scena - Scene1.ResetStatus() - ' reset stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - End If + m_Controller.ExecuteCommand(CMD.DELETE) + ' con SPAZIO ripeto l'ultimo comando + ElseIf e.KeyData = Keys.Space Then + m_Controller.RepeatLastCommand() End If End Sub + + ' --------------------- Input Box ------------------------------- + Private m_bInput As Boolean = False + Private m_nInpType As IBT = IBT.TY_NULL + + Public Sub SetInputBox(ByRef sTitle As String, ByRef sLabel As String, ByVal nType As IBT) + InputBox.Show() + InputBox.Text = sTitle + InputLabel.Show() + InputLabel.Text = sLabel + InputText.Show() + m_bInput = True + m_nInpType = nType + InputText.Focus() + End Sub + + Public Sub ResetInputBox() + InputBox.Hide() + InputBox.Text = "" + InputLabel.Hide() + InputLabel.Text = "" + InputText.Hide() + InputText.Text = "" + m_nInpType = IBT.TY_NULL + m_bInput = False + End Sub + + Private Function SetInputBoxDouble(ByVal dVal As Double) As Boolean + Dim sText As New StringBuilder + sText.Append(dVal.ToString("F3", CultureInfo.InvariantCulture)) + InputText.Text = sText.ToString() + Return True + End Function + + Private Function SetInputBoxPoint3d(ByVal PtVal As Point3d) As Boolean + Dim sText As New StringBuilder + sText.Append(PtVal.x.ToString("F3", CultureInfo.InvariantCulture)) + sText.Append(",") + sText.Append(PtVal.y.ToString("F3", CultureInfo.InvariantCulture)) + sText.Append(",") + sText.Append(PtVal.z.ToString("F3", CultureInfo.InvariantCulture)) + InputText.Text = sText.ToString() + Return True + End Function + + Private Function GetInputBoxDouble(ByRef dVal As Double) As Boolean + Return Double.TryParse(InputText.Text, NumberStyles.Float, CultureInfo.InvariantCulture, dVal) + End Function + + Private Function GetInputBoxPoint3d(ByRef PtVal As Point3d) As Boolean + Dim sItems() As String = InputText.Text.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 + + Private Function InputBoxTextToLast() As Boolean + Select Case m_nInpType + Case IBT.TY_DOUBLE + Dim dVal As Double + If GetInputBoxDouble(dVal) Then + m_Controller.SetLastDouble(dVal) + Return True + End If + Case IBT.TY_POINT3D + Dim ptP As Point3d + If GetInputBoxPoint3d(ptP) Then + m_Controller.SetLastPoint3d(ptP) + Return True + End If + End Select + Return False + End Function + + Private Sub InputText_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles InputText.KeyDown + ' Con SHIFT aggiorno la grafica con i dati correnti + If (e.KeyData And Keys.Shift) = Keys.Shift Then + InputBoxTextToLast() + Scene1.DisableDrag() + EgtResetGeoLine() + m_Controller.ExecuteDrag() + ' Con RETURN devo eseguire lo stato corrente + ElseIf e.KeyData = Keys.Return Then + InputBoxTextToLast() + m_Controller.GoToNextStatus() + End If + End Sub + + '-------------------------------- Command Box ---------------------------------------------------- Private Sub tboxCmd_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles tboxCmd.KeyDown If (e.KeyCode = Keys.Enter) Then @@ -995,121 +736,51 @@ Public Class Form1 End If End Sub - '-------------------------------- Current Piece/Layer -------------------------------------------- - Private m_nCurrPart = GDB_ID.NULL - Private m_nCurrLayer = GDB_ID.NULL + '-------------------------------- Current Piece/Layer -------------------------------------------- Private Sub btnNewPart_Click(sender As System.Object, e As System.EventArgs) Handles btnNewPart.Click - ' 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 + m_Controller.ExecuteCommand(CMD.NEWPART) ' aggiorno visualizzazione EmitCurrPartLayer() LoadObjTree() End Sub Private Sub btnNewLayer_Click(sender As System.Object, e As System.EventArgs) Handles btnNewLayer.Click - ' 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 + m_Controller.ExecuteCommand(CMD.NEWLAYER) ' aggiorno visualizzazione EmitCurrPartLayer() LoadObjTree() End Sub Private Sub btnColor_Click(sender As System.Object, e As System.EventArgs) Handles btnColor.Click - 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 - End If - Dim colObj As Color3d - EgtGetCalcColor(nCurrId, colObj) - ColorDialog1.Color = colObj.ToColor() - If ColorDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then - colObj.FromColor(ColorDialog1.Color) - EgtSetColor(nCurrId, colObj) - EmitCurrPartLayer() - SetModified() - EgtDraw() - End If - End Sub - - Private Function SetCurrPartLayer(ByVal nPart As Integer, ByVal nLayer As Integer) - ' verifico esistenza - If Not EgtExistsObj(nPart) Or EgtGetParent(nLayer) <> nPart Then - Return False - End If - ' assegno - m_nCurrPart = nPart - m_nCurrLayer = nLayer - ' aggiorno visualizzazione - EmitCurrPartLayer() - Return True - End Function - - Private Sub ResetCurrPartLayer() - ' 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 + m_Controller.ExecuteCommand(CMD.LAYERCOLOR) ' aggiorno visualizzazione EmitCurrPartLayer() End Sub - Private Function GetCurrPart() As Integer - Return m_nCurrPart - End Function - - Private Function GetCurrLayer() As Integer - Return m_nCurrLayer - End Function - Private Sub EmitCurrPartLayer() Dim sText As String = " " Dim colObj As Color3d EgtGetColor(GDB_ID.ROOT, colObj) - If m_nCurrPart <> GDB_ID.NULL Then - sText = "Part " + m_nCurrPart.ToString() - EgtGetCalcColor(m_nCurrPart, colObj) - If m_nCurrLayer <> GDB_ID.NULL And EgtExistsObj(m_nCurrLayer) Then - sText += " --> Layer " + m_nCurrLayer.ToString() - EgtGetCalcColor(m_nCurrLayer, colObj) + Dim nCurrPart As Integer = m_Controller.GetCurrPart() + If nCurrPart <> GDB_ID.NULL Then + sText = "Part " + nCurrPart.ToString() + EgtGetCalcColor(nCurrPart, colObj) + Dim nCurrLayer As Integer = m_Controller.GetCurrLayer() + If nCurrLayer <> GDB_ID.NULL And EgtExistsObj(nCurrLayer) Then + sText += " --> Layer " + nCurrLayer.ToString() + EgtGetCalcColor(nCurrLayer, colObj) End If End If txtPartLay.Text = sText + colObj.A = 100 txtColor.BackColor = colObj.ToColor() End Sub '-------------------------------- Tree View ------------------------------------------------------ Private m_nObjTreeOldId As Integer = GDB_ID.NULL + Private m_bMark As Boolean = True Private Sub ObjTreeTickEvent(source As Object, e As EventArgs) Handles ObjTreeTimer.Tick If m_nObjTreeOldId <> GDB_ID.NULL Then @@ -1119,18 +790,23 @@ Public Class Form1 ObjTreeTimer.Stop() End Sub - Private Sub LoadObjTree() - ClearObjTree() + Public Sub LoadObjTree() + Dim nOldId As Integer = ClearObjTree() TreeView1.BeginUpdate() - 'TreeView1.Nodes.Add(GDB_ID.NULL.ToString, "No Selection", 0, 0) AddGroupInObjTree(GDB_ID.ROOT, 0, TreeView1.Nodes) TreeView1.EndUpdate() + If nOldId <> GDB_ID.NULL Then + m_bMark = False + SelectIdInObjTree(nOldId) + m_bMark = True + End If End Sub - Private Sub ClearObjTree() - RevertOldIdInObjTree() + Private Function ClearObjTree() As Integer + Dim nOldId As Integer = RevertOldIdInObjTree() TreeView1.Nodes.Clear() - End Sub + Return nOldId + End Function Private Sub AddGroupInObjTree(ByVal nGroupId As Integer, ByVal nLev As Integer, ByRef PrevNodColl As TreeNodeCollection) @@ -1256,10 +932,14 @@ Public Class Form1 ElseIf nIdParent = GDB_ID.ROOT Then ' cerco il primo Layer del Part Dim nId As Integer = EgtGetFirstGroupInGroup(m_nObjTreeOldId) - SetCurrPartLayer(m_nObjTreeOldId, nId) + m_Controller.SetLastIntegers(m_nObjTreeOldId, nId) + m_Controller.ExecuteCommand(CMD.SETCURRPARTLAYER) + EmitCurrPartLayer() ' se Layer ElseIf EgtGetParent(nIdParent) = GDB_ID.ROOT Then - SetCurrPartLayer(nIdParent, m_nObjTreeOldId) + m_Controller.SetLastIntegers(nIdParent, m_nObjTreeOldId) + m_Controller.ExecuteCommand(CMD.SETCURRPARTLAYER) + EmitCurrPartLayer() End If End If End Sub @@ -1267,26 +947,10 @@ Public Class Form1 Private Sub ObjTree_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles TreeView1.KeyDown ' Con DEL eseguo cancellazione del pezzo o del layer selezionati If e.KeyData = Keys.Delete Then - ' posso partire solo da stato libero - If m_nStatus <> EST.NULL Then - Return - End If - ' lancio la cancellazione - If m_nObjTreeOldId <> GDB_ID.NULL Then - EgtErase(m_nObjTreeOldId) - SetModified() - ' reset stato scena - Scene1.ResetStatus() - ' reset stato - m_nStatus = EST.NULL - ToolStripStatusOutput.Text = "" - ' aggiorno visualizzazione - If m_nObjTreeOldId = m_nCurrPart Or m_nObjTreeOldId = m_nCurrLayer Then - ResetCurrPartLayer() - End If - m_nObjTreeOldId = GDB_ID.NULL - LoadObjTree() - End If + m_Controller.SetLastIntegers(m_nObjTreeOldId, 0) + m_Controller.ExecuteCommand(CMD.DELETEPARTLAYER) + EmitCurrPartLayer() + LoadObjTree() End If End Sub @@ -1312,6 +976,10 @@ Public Class Form1 tBoxInfo.Text = String.Empty End If End If + If Not m_bMark Then + m_nObjTreeOldId = nId + Return + End If ' permetto in ogni caso la visualizzazione dell'oggetto e lo evidenzio Dim nOldMode As Integer = GDB_MD.STD EgtGetMode(nId, nOldMode) @@ -1349,58 +1017,23 @@ Public Class Form1 Dim tNode() As TreeNode = TreeView1.Nodes.Find(nId.ToString, True) If tNode.Length > 0 Then TreeView1.SelectedNode = tNode(0) + TreeView1.SelectedNode.Expand() Return True Else Return False End If End Function - '-------------------------------- Modified Status ------------------------------------------------ - Private m_bModified As Boolean = False - - Private Sub SetModified() - m_bModified = True - EmitTitle() - End Sub - - Private Sub ResetModified() - m_bModified = False - EmitTitle() - End Sub - - Private 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 - Scene1.SaveProject(m_sCurrFile) - Return True - Case Windows.Forms.DialogResult.No - Return True - Case Else - Return False - End Select - End Function - '-------------------------------- Program Title -------------------------------------------------- Private Sub EmitTitle() ' nome file - Dim sTitle As String = m_sCurrFile - If String.IsNullOrEmpty(m_sCurrFile) Then + Dim sTitle As String = m_Controller.GetCurrFile() + If String.IsNullOrEmpty(sTitle) Then sTitle = "New" End If ' indicazione di modificato - If m_bModified Then + If m_Controller.GetModified() Then sTitle += "*" End If ' dati del prodotto diff --git a/GenInterface.vb b/GenInterface.vb index 2aa7ceb..9b9e0e0 100644 --- a/GenInterface.vb +++ b/GenInterface.vb @@ -13,6 +13,16 @@ Public Shared Function GetPrivateProfileInt( ByVal lpFileName As String) As Integer End Function +Public Shared Function GetPrivateProfileDouble( + ByVal lpAppName As String, + ByVal lpKeyName As String, + ByVal dDefault As Double, + ByVal lpFileName As String) As Double + Dim sValue As String = String.Empty + GetPrivateProfileString(lpAppName, lpKeyName, dDefault.ToString(), sValue, lpFileName) + Return Double.Parse(sValue, System.Globalization.CultureInfo.InvariantCulture) +End Function + Private Shared Function GetPrivateProfileString( ByVal lpAppName As String, diff --git a/My Project/AssemblyInfo.vb b/My Project/AssemblyInfo.vb index d31bb3c..20840c9 100644 --- a/My Project/AssemblyInfo.vb +++ b/My Project/AssemblyInfo.vb @@ -43,5 +43,5 @@ Imports System.Runtime.InteropServices ' utilizzando l'asterisco (*) come descritto di seguito: ' - - + + diff --git a/My Project/Resources.Designer.vb b/My Project/Resources.Designer.vb index c7d570c..eeb7586 100644 --- a/My Project/Resources.Designer.vb +++ b/My Project/Resources.Designer.vb @@ -59,365 +59,5 @@ Namespace My.Resources resourceCulture = value End Set End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property _New() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("New", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Analyze() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Analyze", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Arc3P() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Arc3P", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property ArcCSE() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("ArcCSE", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Copy() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Copy", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property CurveDir() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("CurveDir", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Delete() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Delete", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Exec() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Exec", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Export() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Export", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property GetDist() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("GetDist", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Import() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Import", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property InvertCurve() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("InvertCurve", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Line2P() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Line2P", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromBACK() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromBACK", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromFRONT() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromFRONT", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromISO_NE() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromISO_NE", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromISO_NW() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromISO_NW", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromISO_SE() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromISO_SE", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromISO_SW() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromISO_SW", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromLEFT() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromLEFT", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromRIGHT() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromRIGHT", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property LookFromTOP() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("LookFromTOP", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Mirror() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Mirror", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Move() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Move", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Open() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Open", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Plane() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Plane", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Point() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Point", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property RenderingHL() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("RenderingHL", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property RenderingSH() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("RenderingSH", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property RenderingWF() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("RenderingWF", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Rotate() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Rotate", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property Save() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("Save", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property SaveAs() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("SaveAs", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property ZoomAll() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("ZoomAll", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property ZoomIn() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("ZoomIn", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property - - ''' - ''' Cerca una risorsa localizzata di tipo System.Drawing.Bitmap. - ''' - Friend ReadOnly Property ZoomOut() As System.Drawing.Bitmap - Get - Dim obj As Object = ResourceManager.GetObject("ZoomOut", resourceCulture) - Return CType(obj,System.Drawing.Bitmap) - End Get - End Property End Module End Namespace diff --git a/My Project/Resources.resx b/My Project/Resources.resx index 198f7e8..29dcb1b 100644 --- a/My Project/Resources.resx +++ b/My Project/Resources.resx @@ -117,113 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\GetDist.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Plane.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Rotate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Analyze.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromISO_NE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromTOP.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Line2P.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromBACK.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Mirror.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromISO_SE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RenderingWF.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Move.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromRIGHT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\CurveDir.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Point.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RenderingHL.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Exec.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ZoomOut.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\New.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\SaveAs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ZoomIn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ArcCSE.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromLEFT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Arc3P.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromFRONT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ZoomAll.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RenderingSH.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromISO_SW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LookFromISO_NW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\InvertCurve.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - \ No newline at end of file diff --git a/Resources/Arc3P.png b/Resources/Arc3P.png index 9779235..c246b9d 100644 Binary files a/Resources/Arc3P.png and b/Resources/Arc3P.png differ diff --git a/Resources/ChangeColor.png b/Resources/ChangeColor.png new file mode 100644 index 0000000..59beeda Binary files /dev/null and b/Resources/ChangeColor.png differ diff --git a/Resources/CircleCR.png b/Resources/CircleCR.png new file mode 100644 index 0000000..c825800 Binary files /dev/null and b/Resources/CircleCR.png differ diff --git a/Resources/Extrude.png b/Resources/Extrude.png new file mode 100644 index 0000000..1316cfc Binary files /dev/null and b/Resources/Extrude.png differ diff --git a/Resources/InvertCurve.png b/Resources/InvertCurve.png index a216dfb..4458752 100644 Binary files a/Resources/InvertCurve.png and b/Resources/InvertCurve.png differ diff --git a/Resources/JoinCurve.png b/Resources/JoinCurve.png new file mode 100644 index 0000000..70d4b02 Binary files /dev/null and b/Resources/JoinCurve.png differ diff --git a/Resources/Plane.png b/Resources/Plane.png index 047ceba..b0b8ae1 100644 Binary files a/Resources/Plane.png and b/Resources/Plane.png differ diff --git a/Resources/Revolve.png b/Resources/Revolve.png new file mode 100644 index 0000000..5a9fcdc Binary files /dev/null and b/Resources/Revolve.png differ diff --git a/Resources/SelPoint.cur b/Resources/SelPoint.cur new file mode 100644 index 0000000..3cf9dee Binary files /dev/null and b/Resources/SelPoint.cur differ diff --git a/Resources/SplitCurve.png b/Resources/SplitCurve.png new file mode 100644 index 0000000..0944283 Binary files /dev/null and b/Resources/SplitCurve.png differ diff --git a/Scene.Designer.vb b/Scene.Designer.vb index d48c6cf..71d0bc4 100644 --- a/Scene.Designer.vb +++ b/Scene.Designer.vb @@ -28,18 +28,19 @@ Partial Class Scene Me.cmdDeselectAll = New System.Windows.Forms.ToolStripMenuItem() Me.SepSel1 = New System.Windows.Forms.ToolStripSeparator() Me.cmdWinSelect = New System.Windows.Forms.ToolStripMenuItem() + Me.cmdSketchPoint = New System.Windows.Forms.ToolStripMenuItem() + Me.cmdGridPoint = New System.Windows.Forms.ToolStripMenuItem() Me.cmdEndPoint = New System.Windows.Forms.ToolStripMenuItem() Me.cmdMidPoint = New System.Windows.Forms.ToolStripMenuItem() Me.cmdCenterPoint = New System.Windows.Forms.ToolStripMenuItem() Me.cmdNearPoint = New System.Windows.Forms.ToolStripMenuItem() - Me.cmdSketchPoint = New System.Windows.Forms.ToolStripMenuItem() - Me.cmdGridPoint = New System.Windows.Forms.ToolStripMenuItem() + Me.cmdResumeDrag = New System.Windows.Forms.ToolStripMenuItem() Me.MenuScene.SuspendLayout() Me.SuspendLayout() ' 'MenuScene ' - Me.MenuScene.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.cmdSelectAll, Me.cmdDeselectAll, Me.SepSel1, Me.cmdWinSelect, Me.cmdSketchPoint, Me.cmdGridPoint, Me.cmdEndPoint, Me.cmdMidPoint, Me.cmdCenterPoint, Me.cmdNearPoint}) + Me.MenuScene.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.cmdSelectAll, Me.cmdDeselectAll, Me.SepSel1, Me.cmdWinSelect, Me.cmdResumeDrag, Me.cmdSketchPoint, Me.cmdGridPoint, Me.cmdEndPoint, Me.cmdMidPoint, Me.cmdCenterPoint, Me.cmdNearPoint}) Me.MenuScene.Name = "ContextMenuStrip1" Me.MenuScene.ShowCheckMargin = True Me.MenuScene.ShowImageMargin = False @@ -68,6 +69,18 @@ Partial Class Scene Me.cmdWinSelect.Size = New System.Drawing.Size(152, 22) Me.cmdWinSelect.Text = "Select Window" ' + 'cmdSketchPoint + ' + Me.cmdSketchPoint.Name = "cmdSketchPoint" + Me.cmdSketchPoint.Size = New System.Drawing.Size(152, 22) + Me.cmdSketchPoint.Text = "Sketch Point" + ' + 'cmdGridPoint + ' + Me.cmdGridPoint.Name = "cmdGridPoint" + Me.cmdGridPoint.Size = New System.Drawing.Size(152, 22) + Me.cmdGridPoint.Text = "Grid Point" + ' 'cmdEndPoint ' Me.cmdEndPoint.Name = "cmdEndPoint" @@ -92,17 +105,11 @@ Partial Class Scene Me.cmdNearPoint.Size = New System.Drawing.Size(152, 22) Me.cmdNearPoint.Text = "Near Point" ' - 'cmdSketchPoint + 'cmdResumeDrag ' - Me.cmdSketchPoint.Name = "cmdSketchPoint" - Me.cmdSketchPoint.Size = New System.Drawing.Size(152, 22) - Me.cmdSketchPoint.Text = "Sketch Point" - ' - 'cmdGridPoint - ' - Me.cmdGridPoint.Name = "cmdGridPoint" - Me.cmdGridPoint.Size = New System.Drawing.Size(152, 22) - Me.cmdGridPoint.Text = "Grid Point" + Me.cmdResumeDrag.Name = "cmdResumeDrag" + Me.cmdResumeDrag.Size = New System.Drawing.Size(152, 22) + Me.cmdResumeDrag.Text = "ResumeDrag" ' 'Scene ' @@ -125,5 +132,6 @@ End Sub Friend WithEvents SepSel1 As System.Windows.Forms.ToolStripSeparator Friend WithEvents cmdSketchPoint As System.Windows.Forms.ToolStripMenuItem Friend WithEvents cmdGridPoint As System.Windows.Forms.ToolStripMenuItem + Friend WithEvents cmdResumeDrag As System.Windows.Forms.ToolStripMenuItem End Class diff --git a/Scene.vb b/Scene.vb index bc6c0e7..90a7e2f 100644 --- a/Scene.vb +++ b/Scene.vb @@ -14,18 +14,20 @@ Public Class Scene Private m_nOldStatus As ST Private Enum ST As Integer NULL = 0 - PAN = 1 - ROT = 2 - ZOOMWIN = 3 - WINSEL = 4 - ANALYZE = 5 - GETDIST = 6 - GETDIST2 = 7 - SELPOINT = 8 + PAN + ROT + ZOOMWIN + WINSEL + ANALYZE + GETDIST + GETDIST2 + SELPOINT + SELPOINTZ End Enum Private m_nSnapType As Integer Private m_PrevPoint As Point Private m_ptPrev As Point3d + Private m_ptGrid As Point3d Private m_nDriver As Integer Private m_b2Buff As Boolean Private m_nColorBits As Integer @@ -38,7 +40,6 @@ Public Class Scene Private m_ZwColor As Color3d Private m_DstLnColor As Color3d - '---- Constructor ----- Sub New() ' Chiamata richiesta dalla finestra di progettazione. @@ -188,7 +189,7 @@ Public Class Scene If e.Button = Windows.Forms.MouseButtons.Left Then ' se stato WINSEL oppure NULL e premuto SHIFT allora inizio selezione a finestra If m_nStatus = ST.WINSEL Or - (m_nStatus = ST.NULL And (Control.ModifierKeys And Keys.Shift) = Keys.Shift) Then + (m_nStatus = ST.NULL And (ModifierKeys And Keys.Shift) = Keys.Shift) Then Cursor = New Cursor(Me.GetType(), "WinSelect.cur") m_PrevPoint = e.Location m_nStatus = ST.WINSEL @@ -258,29 +259,47 @@ Public Class Scene ' se stato selezione punto ElseIf m_nStatus = ST.SELPOINT Then If 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 + RaiseEvent OnMouseSelectedPoint(Me, m_ptPrev) + 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) End If End If ' --- Pressione tasto medio (rotella) --- ElseIf e.Button = Windows.Forms.MouseButtons.Middle Then - ' se premuto SHIFT entro in zoom a finestra - If (Control.ModifierKeys And Keys.Shift) = Keys.Shift Then - SaveCurrStatus() - m_nStatus = ST.ZOOMWIN - Cursor = New Cursor(Me.GetType(), "ZoomWin.cur") - ' se premuto CTRL entro in rotazione vista - ElseIf (Control.ModifierKeys And Keys.Control) = Keys.Control Then - SaveCurrStatus() - m_nStatus = ST.ROT - Cursor = New Cursor(Me.GetType(), "Rotate.cur") - ' altrimenti entro in pan - Else - SaveCurrStatus() - m_nStatus = ST.PAN - Cursor = New Cursor(Me.GetType(), "Pan.cur") + ' 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 - ' salvo il punto in coordinate finestra - m_PrevPoint = e.Location ' --- Tutti gli altri casi --- Else MyBase.OnMouseDown(e) @@ -351,29 +370,39 @@ Public Class Scene Next ElseIf m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Or m_nStatus = ST.SELPOINT Then MenuScene.Visible = True - For Each i As ToolStripItem In MenuScene.Items - If i.Name = "cmdSketchPoint" Then - i.Visible = True - DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_SKETCH) - ElseIf i.Name = "cmdGridPoint" Then - i.Visible = True - DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_GRID) - ElseIf i.Name = "cmdEndPoint" Then - i.Visible = True - DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_END) - ElseIf i.Name = "cmdMidPoint" Then - i.Visible = True - DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_MID) - ElseIf i.Name = "cmdCenterPoint" Then - i.Visible = True - DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.CENTER) - ElseIf i.Name = "cmdNearPoint" Then - i.Visible = True - DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_NEAR) - Else - i.Visible = False - End If - Next + If m_bDragOn Then + For Each i As ToolStripItem In MenuScene.Items + If i.Name = "cmdSketchPoint" Then + i.Visible = True + DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_SKETCH) + ElseIf i.Name = "cmdGridPoint" Then + i.Visible = True + DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_GRID) + ElseIf i.Name = "cmdEndPoint" Then + i.Visible = True + DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_END) + ElseIf i.Name = "cmdMidPoint" Then + i.Visible = True + DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_MID) + ElseIf i.Name = "cmdCenterPoint" Then + i.Visible = True + DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.CENTER) + ElseIf i.Name = "cmdNearPoint" Then + i.Visible = True + DirectCast(i, ToolStripMenuItem).Checked = (m_nSnapType = SP.PT_NEAR) + Else + i.Visible = False + End If + Next + Else + For Each i As ToolStripItem In MenuScene.Items + If i.Name = "cmdResumeDrag" Then + i.Visible = True + Else + i.Visible = False + End If + Next + End If Else MenuScene.Visible = False End If @@ -393,15 +422,13 @@ Public Class Scene If nOldGseCtx <> m_nGseContext Then EgtSetCurrentContext(m_nGseContext) End If - 'Visualizzo le coordinate del mouse + ' Visualizzo le coordinate del mouse ShowCursorPos(e.Location) ' --- Premuto tasto sinistro --- If e.Button = Windows.Forms.MouseButtons.Left Then If m_nStatus = ST.WINSEL Then Cursor = New Cursor(Me.GetType(), "WinSelect.cur") EgtSetWinRect(m_PrevPoint, e.Location, True) - 'Else - ' m_nStatus = ST.NULL End If ' --- Premuto tasto centrale (rotella) --- ElseIf e.Button = Windows.Forms.MouseButtons.Middle Then @@ -433,10 +460,22 @@ Public Class Scene EgtUnProjectPoint(e.Location, ptP) EgtSetGeoLine(m_ptPrev, ptP) ElseIf m_nStatus = ST.SELPOINT Then - Cursor = New Cursor(Me.GetType(), "Select.cur") + Cursor = New Cursor(Me.GetType(), "SelPoint.cur") Dim ptP As Point3d - If EgtGetGraphicSnapPoint(SP.PT_SKETCH, e.Location, DIM_SEL, DIM_SEL, ptP) Then - RaiseEvent OnMouseMoveSelPoint(Me, ptP) + 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) @@ -451,9 +490,8 @@ Public Class Scene End Sub Protected Overrides Sub OnMouseWheel(e As System.Windows.Forms.MouseEventArgs) - ' devo essere nello stato NULL o ANALYZE o GETDIST o SELPOINT - If m_nStatus <> ST.NULL And m_nStatus <> ST.ANALYZE And m_nStatus <> ST.GETDIST And - m_nStatus <> ST.GETDIST2 And m_nStatus <> ST.SELPOINT Then + ' devo essere in uno stato ripristinabile + If Not IsRestorableCurrStatus() Then Return End If ' trascuro rotazioni molto piccole @@ -480,39 +518,62 @@ Public Class Scene End Sub Private Sub ShowCursorPos(ByVal WinXY As Point) - 'ricavo punto 3d - Dim ptWorld As Point3d - EgtUnProjectPoint(WinXY, ptWorld) - 'ricavo direzione di vista - Dim nDir As Integer - EgtGetCameraDir(nDir) - 'costruisco stringa con dati + Dim sCursorPos As New System.Text.StringBuilder - Select Case nDir - Case VT.TOP, VT.BOTTOM + Dim ptWorld As Point3d + + ' se lo stato prevede lo snap a un punto e riesco a ricavare un punto 3d snap + If (m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Or m_nStatus = ST.SELPOINT) And + EgtGetGraphicSnapPoint(IIf(m_nSnapType = SP.PT_GRID, SP.PT_GRID, SP.PT_SKETCH), + WinXY, DIM_SEL, DIM_SEL, ptWorld) Then 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=") + ' se snap a punto in Z e riesco a ricavare un punto 3d snap + ElseIf m_nStatus = ST.SELPOINTZ And + EgtGetGridSnapPointZ((m_nSnapType = SP.PT_SKETCH), WinXY, m_ptGrid, ptWorld) Then + sCursorPos.Append("X=") + sCursorPos.Append(ptWorld.x.ToString("F4", CultureInfo.InvariantCulture)) + 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 + ' altrimenti ricavo il punto 3d da proiezione inversa + Else + EgtUnProjectPoint(WinXY, ptWorld) + 'ricavo direzione di vista + Dim nDir As Integer + EgtGetCameraDir(nDir) + 'costruisco stringa con dati + 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 + End If ' lancio l'evento per visualizzare la stringa RaiseEvent OnCursorPos(Me, sCursorPos.ToString) End Sub Private Sub MenuScene_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles MenuScene.ItemClicked - + ' Per selezione If e.ClickedItem.Name = "cmdSelectAll" Then ElseIf e.ClickedItem.Name = "cmdDeselectAll" Then @@ -520,6 +581,11 @@ Public Class Scene EgtDraw() ElseIf e.ClickedItem.Name = "cmdWinSelect" Then m_nStatus = ST.WINSEL + ' Riabilitazione drag sospeso + ElseIf e.ClickedItem.Name = "cmdResumeDrag" Then + EgtResetGeoLine() + m_bDragOn = True + ' Scelta tipo punto snap ElseIf e.ClickedItem.Name = "cmdSketchPoint" Then m_nSnapType = SP.PT_SKETCH ElseIf e.ClickedItem.Name = "cmdGridPoint" Then @@ -536,20 +602,26 @@ Public Class Scene End Sub '---- Status management ------------- + Private Function IsRestorableCurrStatus() As Boolean + Select Case m_nStatus + Case ST.NULL, ST.ANALYZE, ST.GETDIST, ST.GETDIST2, ST.SELPOINT, ST.SELPOINTZ + Return True + Case Else + Return False + End Select + End Function + Private Sub SaveCurrStatus() - If m_nStatus = ST.WINSEL Or - m_nStatus = ST.ANALYZE Or - m_nStatus = ST.GETDIST Or m_nStatus = ST.GETDIST2 Or - m_nStatus = ST.SELPOINT Then + If IsRestorableCurrStatus() Then m_nOldStatus = m_nStatus End If End Sub Private Function RestoreStatus() As Boolean ' eventuale ripristino vecchio stato - If m_nOldStatus = ST.WINSEL Then + If m_nOldStatus = ST.NULL Then m_nStatus = m_nOldStatus - Cursor = New Cursor(Me.GetType(), "WinSelect.cur") + Cursor = New Cursor(Me.GetType(), "Select.cur") Return True ElseIf m_nOldStatus = ST.ANALYZE Then m_nStatus = m_nOldStatus @@ -559,9 +631,9 @@ Public Class Scene m_nStatus = m_nOldStatus Cursor = New Cursor(Me.GetType(), "GetDist.cur") Return True - ElseIf m_nOldStatus = ST.SELPOINT Then + ElseIf m_nOldStatus = ST.SELPOINT Or m_nOldStatus = ST.SELPOINTZ Then m_nStatus = m_nOldStatus - Cursor = New Cursor(Me.GetType(), "Select.cur") + Cursor = New Cursor(Me.GetType(), "SelPoint.cur") Return True End If Return False @@ -587,6 +659,8 @@ Public Class Scene ' imposto lo stato m_nStatus = ST.NULL m_nOldStatus = ST.NULL + ' abilito drag + m_bDragOn = True ' aggiorno visualizzazione If bRedraw Then EgtDraw() @@ -610,8 +684,21 @@ Public Class Scene End Sub '---- Drag Group ------ + Private m_bDragOn As Boolean = True 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() As Boolean m_nDragGroup = EgtCreateGroup(GDB_ID.ROOT) If m_nDragGroup = GDB_ID.NULL Then @@ -631,7 +718,14 @@ Public Class Scene End Function Public Function AddToDragGroup(ByVal nId As Integer) As Boolean - Return EgtCopyGlob(nId, m_nDragGroup, GDB_POS.SON) <> GDB_ID.NULL + Dim nNewId As Integer = EgtCopyGlob(nId, m_nDragGroup, GDB_POS.SON) + If nNewId = GDB_ID.NULL Then + Return False + End If + Dim ColObj As Color3d + EgtGetCalcColor(nId, ColObj) + EgtSetColor(nNewId, ColObj) + Return True End Function Public Function GetDragGroup() As Integer @@ -639,8 +733,14 @@ Public Class Scene End Function '---- Main Buttons ---- - Public Function NewProject() As Boolean + Public Function NewProject(Optional ByVal bCreatePart As Boolean = False) As Boolean Dim bOk As Boolean = EgtNewFile() + If bCreatePart Then + ' 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) + End If EgtZoom(ZM.ALL) If bOk Then RaiseEvent OnNewProject(Me) diff --git a/TestEIn.vbproj b/TestEIn.vbproj index 75473ba..0249530 100644 --- a/TestEIn.vbproj +++ b/TestEIn.vbproj @@ -154,6 +154,12 @@ Form + + + True + True + Resources.resx + SelectMulti.vb @@ -174,11 +180,6 @@ True Application.myapp - - True - True - Resources.resx - True Settings.settings @@ -200,9 +201,9 @@ VbMyResourcesResXFileCodeGenerator - Resources.Designer.vb My.Resources Designer + Resources.Designer.vb Scene.vb @@ -372,6 +373,12 @@ + + + + + + IF "$(PlatformName)"=="x86" IF "$(ConfigurationName)" == "Release" copy $(TargetPath) c:\EgtProg\TestEIn\TestEInR32.exe