Imports EgtUILib

Public Class CopyTemplateUC

   ' Riferimenti a pagine
   Private m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
   Private WithEvents m_CurrProjPage As CurrentProjectPageUC
   ' Flag di pagina attiva
   Private m_bActive As Boolean = False
   ' Array stringhe modalità di acquisizione dei punti
   Private m_PointsModeArray(2) As String
   ' Origine tavola e dati grezzo
   Private m_bTabOk As Boolean = False
   Private m_ptTabOri As Point3d
   Private m_ptRawMin As Point3d
   Private m_ptRawMax As Point3d
   ' Punto P1 acquisito
   Private m_ptTipP1 As Point3d
   ' Punti precedenti
   Private m_nPrevPt As Integer = 0
   Private m_ptPrev(1) As Point3d
   ' Variabile che indica se il disegno è salvabile
   Private m_bDrawOk As Boolean = False
   ' Punto selezionato nel disegno
   Private m_bMouseOk As Boolean = False
   Private m_ptMouse As Point3d
   ' Layer per crocette temporanee
   Private m_nTempLay As Integer = GDB_ID.NULL
   ' Modalità di disegno
   Private m_CurrCurveType As CurveType

   ' Costanti per tipo acquisizione punti
   Private Enum PT_MODE As Integer
      SAW = 0
      LASER = 1
      DRAW = 2
   End Enum
   ' Costanti per tipo di curva da disegnare
   Private Enum CurveType
      LINE
      ARC
   End Enum

   Private Sub CopyTemplate_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
      ' Creo lista modalità di acquisizione punto 
      m_PointsModeArray(PT_MODE.SAW) = EgtMsg(MSG_DIRECTCUTPAGEUC + 24)
      m_PointsModeArray(PT_MODE.LASER) = EgtMsg(MSG_DIRECTCUTPAGEUC + 12)
      m_PointsModeArray(PT_MODE.DRAW) = EgtMsg(MSG_DIRECTCUTPAGEUC + 25)
      ' la associo alla combobox
      PointModeCmBx.ItemsSource = m_PointsModeArray

      Point1Btn.ToolTip = EgtMsg(MSG_DIRECTCUTPAGEUC + 10)
      LineBtn.ToolTip = EgtMsg(MSG_DIRECTCUTPAGEUC + 50)
      ArcBtn.ToolTip = EgtMsg(MSG_DIRECTCUTPAGEUC + 51)
      RemoveBtn.ToolTip = EgtMsg(MSG_DIRECTCUTPAGEUC + 52)
      CloseBtn.ToolTip = EgtMsg(MSG_DIRECTCUTPAGEUC + 53)
      SaveBtn.ToolTip = EgtMsg(MSG_DIRECTCUTPAGEUC + 54)
   End Sub

   Private Sub CopyTemplate_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
      m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC
      m_bActive = True
      SaveBtn.IsEnabled = False
      LineBtn.IsChecked = True
      ArcBtn.IsChecked = False
      Point1Btn.IsEnabled = True
      RemoveBtn.IsEnabled = True
      CloseBtn.IsEnabled = True
      m_CurrCurveType = CurveType.LINE
      ' Origine tavola
      m_bTabOk = True
      If Not EgtGetTableRef(1, m_ptTabOri) Then
         m_bTabOk = False
         EgtOutLog("Error on TableRef1")
      End If
      ' Dati del grezzo
      If Not GetRawBox(m_ptRawMin, m_ptRawMax) Then
         m_ptRawMin = m_ptTabOri
         m_ptRawMax = m_ptTabOri
      End If
      ' Nessun punto acquisito
      m_nPrevPt = 0
      ' Reset punto da mouse
      m_bMouseOk = False
      ' Imposto modalità di acquisizione punti
      PointModeCmBx.SelectedIndex = PT_MODE.DRAW
      ' Reset taglio e disabilito bottone esecuzione
      m_bDrawOk = False
      UpdateOkBtn()
      ' Visualizzo tavola
      EgtSetMachineLook(MCH_LOOK.TAB)
      ' Disabilito registrazione progetto modificato
      EgtDisableModified()
      ' Creo layer temporaneo per crocette
      m_nTempLay = EgtCreateGroup(GDB_ID.ROOT, New Frame3d(m_ptTabOri))
      EgtSetColor(m_nTempLay, New Color3d(255, 0, 0))
      EgtSetLevel(m_nTempLay, GDB_LV.TEMP)
      ' Creo nuovo pezzo e layer per la geometria da definire
      Dim nPartId = EgtCreateGroup(GDB_ID.ROOT)
      EgtSetName(nPartId, NAME_COPYTEMPLATE)
      Dim nLayerId = EgtCreateGroup(nPartId, New Frame3d(m_ptTabOri))
      EgtSetName(nLayerId, NAME_OUTLOOP)
   End Sub

   Friend Sub CopyTemplate_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded
      ' Rimuovo layer temporaneo per crocette
      EgtErase(m_nTempLay)
      ' Rimuovo eventuale pezzo per taglio diretto
      EraseCopyTemplatePart()
      ' Riattivo eventuali lavorazioni presenti
      ActivateAllMachinings()
      ' Abilito registrazione progetto modificato
      EgtEnableModified()
      ' Nascondo la macchina
      m_MainWindow.m_DirectCutPageUC.m_bShowMachine = False
      EgtSetMachineLook(MCH_LOOK.TAB)
      EgtDraw()
      ' Dichiaro pagina non attiva
      m_bActive = False
   End Sub

   Private Sub UpdateOkBtn()
      If m_bDrawOk Then
         SaveBtn.IsEnabled = True
      Else
         SaveBtn.IsEnabled = False
      End If
   End Sub

   Private Sub OnMyMouseDownScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles m_CurrProjPage.OnMouseDownScene
      ' Verifico di essere il gestore attivo
      If Not m_bActive Then Return
      ' Si può selezionare solo con il tasto sinistro e se stato NULL
      If e.Button <> Windows.Forms.MouseButtons.Left Or
         Not m_CurrProjPage.CurrentProjectScene.IsStatusNull() Then
         Return
      End If
      ' Acquisisco punto da disegno
      EgtUnProjectPoint(e.Location, m_ptMouse)
      ' Aggiusto Z punto acquisito (è in globale)
      Dim dPtPrevZ As Double = m_ptMouse.z
      m_ptMouse.z = m_ptRawMax.z
      ' Se direzione di vista calcolabile e da sopra posso aggiustare anche XY
      Dim dAngVertDeg, dAngHorizDeg As Double
      If EgtGetGenericView(dAngVertDeg, dAngHorizDeg) Then
         Dim vtDir As Vector3d = Vector3d.FromSpherical(1, dAngVertDeg, dAngHorizDeg)
         If vtDir.z > EPS_SMALL Then
            m_ptMouse.z = dPtPrevZ
            m_ptMouse += vtDir * (m_ptRawMax.z - m_ptMouse.z) / vtDir.z
         End If
      End If
      ' Porto il punto nell'origine tavola
      m_ptMouse.ToLoc(New Frame3d(m_ptTabOri))
      ' Dichiaro punto da mouse valido
      m_bMouseOk = True
      ' Rimuovo vecchie crocette per mouse
      RemoveMouseCross(m_nTempLay)
      ' Disegno crocetta che indica il punto mouse (in verde)
      CreateCross(m_nTempLay, m_ptMouse, False)
      EgtDraw()
   End Sub

   Private Sub Point1Btn_Click(sender As Object, e As RoutedEventArgs) Handles Point1Btn.Click
      ' Verifico configurazione tavola e grezzo
      If Not m_bTabOk Then Return
      ' Se acquisizione lama o laser
      If PointModeCmBx.SelectedIndex = PT_MODE.SAW Or PointModeCmBx.SelectedIndex = PT_MODE.LASER Then
         ' Recupero la posizione macchina
         Dim dL1, dL2, dL3, dR1, dR2 As Double
         If Not m_MainWindow.m_CNCommunication.GetAxesPositions(dL1, dL2, dL3, dR1, dR2) Then
            Return
         End If
         ' Ricavo dati lama corrente
         Dim sSaw As String = m_MainWindow.m_CurrentMachine.sCurrSaw
         ' Se punto da laser
         If PointModeCmBx.SelectedIndex = PT_MODE.LASER Then
            ' Imposto come testa corrente il laser (senza utensile ovviamente)
            If Not EgtSetCalcTool("", "H3", 1) Then Return
            ' Trasformo in posizione punta utensile in basso
            If Not EgtGetCalcTipFromPositions(dL1, dL2, dL3, dR1, dR2, True, m_ptTipP1) Then Return
            ' Ora imposto la lama corrente
            If Not EgtSetCalcTool(sSaw, "H1", 1) Then Return
         ' Altrimenti da lama
         Else
            ' Imposto la lama corrente
            If Not EgtSetCalcTool(sSaw, "H1", 1) Then Return
            ' Trasformo in posizione punta utensile in basso
            If Not EgtGetCalcTipFromPositions(dL1, dL2, dL3, dR1, dR2, True, m_ptTipP1) Then Return
         End If
         ' Porto il tip nell'origine tavola
         m_ptTipP1.ToLoc(New Frame3d(m_ptTabOri))
      ' Altrimenti punto da click di mouse
      Else
         ' Verifico presenza punto da mouse
         If Not m_bMouseOk Then Return
         ' Ricavo dati lama corrente
         Dim sSaw As String = m_MainWindow.m_CurrentMachine.sCurrSaw
         ' Imposto la lama corrente
         If Not EgtSetCalcTool(sSaw, "H1", 1) Then Return
         ' Assegno punto selezionato nel disegno a m_ptTipP1
         m_ptTipP1 = m_ptMouse
         m_bMouseOk = False
      End If

      ' Se nessun punto precedente
      If m_nPrevPt = 0 Then
         RemoveBtn.IsEnabled = True
         m_nPrevPt = 1
         m_ptPrev(0) = m_ptTipP1
      ' se modalità linea
      ElseIf m_CurrCurveType = CurveType.LINE Then
         CreateLine()
         EgtEmptyGroup(m_nTempLay)
         RemoveBtn.IsEnabled = True
         m_nPrevPt = 1
         m_ptPrev(0) = m_ptTipP1
      ' se altrimenti modalità arco con 1 punto precedenteo
      ElseIf m_nPrevPt = 1 Then
         LineBtn.IsEnabled = False
         RemoveBtn.IsEnabled = False
         m_nPrevPt = 2
         m_ptPrev(1) = m_ptTipP1
      ' altrimenti arco con 2 punti precedenti
      Else
         CreateArc()
         EgtEmptyGroup(m_nTempLay)
         LineBtn.IsEnabled = True
         RemoveBtn.IsEnabled = True
         m_nPrevPt = 1
         m_ptPrev(0) = m_ptTipP1
      End If
      ' Disegno crocetta che indica il punto acquisito
      CreateCross(m_nTempLay, m_ptTipP1)
      ' Aggiorno visualizzazione
      m_MainWindow.m_DirectCutPageUC.m_bShowMachine = True
      EgtDraw()
   End Sub

   Private Sub CreateLine()
      Dim nPart As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_COPYTEMPLATE)
      Dim nOutLoop As Integer = EgtGetFirstNameInGroup(nPart, NAME_OUTLOOP)
      EgtCreateLine(nOutLoop, m_ptPrev(0), m_ptTipP1)
   End Sub

   Private Sub CreateArc()
      Dim nPart As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_COPYTEMPLATE)
      Dim nOutLoop As Integer = EgtGetFirstNameInGroup(nPart, NAME_OUTLOOP)
      EgtCreateArc3P(nOutLoop, m_ptPrev(0), m_ptPrev(1), m_ptTipP1)
   End Sub

   Private Sub SaveBtn_Click(sender As Object, e As RoutedEventArgs) Handles SaveBtn.Click
      Dim MySaveNameWD As New SaveNameWD(m_MainWindow, SaveNameWD.SAVE_TYPE.TEMPLATE)
      MySaveNameWD.ShowDialog()
   End Sub

   Private Sub ExitBtn_Click(sender As Object, e As RoutedEventArgs) Handles ExitBtn.Click
      m_MainWindow.m_DirectCutPageUC.LeftButtonGrid.Children.Remove(Me)
      m_MainWindow.m_DirectCutPageUC.m_ActiveDirectCutPage = DirectCutPageUC.DirectCutPages.DirectCut
   End Sub

   Private Function EraseCopyTemplatePart() As Boolean
      ' Recupero identificativo del pezzo
      Dim nDirPartId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_COPYTEMPLATE)
      While nDirPartId <> GDB_ID.NULL
         ' Cancello il pezzo
         EgtErase(nDirPartId)
         ' Cerco eventuale prossimo
         nDirPartId = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_COPYTEMPLATE)
      End While
      Return True
   End Function

   Private Function CreateCross(nLayerId As Integer, ptP As Point3d, Optional bRed As Boolean = True) As Boolean
      ' Aggiungo crocette
      Dim vtCrossX As New Vector3d(20, 0, 0)
      Dim vtCrossY As New Vector3d(0, 20, 0)
      Dim nCrossId1 = EgtCreateLine(nLayerId, ptP + (-vtCrossX), ptP + vtCrossX)
      Dim nCrossId2 = EgtCreateLine(nLayerId, ptP + (-vtCrossY), ptP + vtCrossY)
      If Not bRed Then
         EgtSetColor(nCrossId1, New Color3d(0, 255, 0))
         EgtSetInfo(nCrossId1, "Mouse", 1)
         EgtSetColor(nCrossId2, New Color3d(0, 255, 0))
         EgtSetInfo(nCrossId2, "Mouse", 1)
      End If
      Return True
   End Function

   Private Function RemoveMouseCross(nLayerId As Integer) As Boolean
      Dim nId As Integer = EgtGetFirstInGroup(nLayerId)
      While nId <> GDB_ID.NULL
         Dim nNextId = EgtGetNext(nId)
         If EgtExistsInfo(nId, "Mouse") Then
            EgtErase(nId)
         End If
         nId = nNextId
      End While
      Return True
   End Function

   Private Sub LineBtn_Click(sender As Object, e As RoutedEventArgs) Handles LineBtn.Click
      If LineBtn.IsChecked Then
         ArcBtn.IsChecked = False
         m_CurrCurveType = CurveType.LINE
      Else
         LineBtn.IsChecked = True
      End If
   End Sub

   Private Sub ArcBtn_Click(sender As Object, e As RoutedEventArgs) Handles ArcBtn.Click
      If ArcBtn.IsChecked Then
         LineBtn.IsChecked = False
         m_CurrCurveType = CurveType.ARC
      Else
         ArcBtn.IsChecked = True
      End If
   End Sub

   Private Sub RemoveBtn_Click(sender As Object, e As RoutedEventArgs) Handles RemoveBtn.Click
      Dim nPart As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_COPYTEMPLATE)
      Dim nOutloop As Integer = EgtGetFirstNameInGroup(nPart, NAME_OUTLOOP)
      Dim nOutLoopCount As Integer = EgtGetGroupObjs(nOutloop)
      If nOutLoopCount > 0 Then
         If nOutLoopCount = 1 Then
            ' Aggiorno ptLast con primo punto
            m_nPrevPt = 1
            EgtStartPoint(EgtGetFirstInGroup(nOutloop), m_ptPrev(0))
            ' Cancello ultima linea
            EgtEmptyGroup(nOutloop)
         Else
            ' Cancello ultima linea
            EgtErase(EgtGetLastInGroup(nOutloop))
            ' Aggiorno ptLast
            m_nPrevPt = 1
            EgtEndPoint(EgtGetLastInGroup(nOutloop), m_ptPrev(0))
         End If
         ' Disegno crocetta che indica il punto acquisito
         EgtEmptyGroup(m_nTempLay)
         CreateCross(m_nTempLay, m_ptPrev(0))
      Else
         m_nPrevPt = 0
         EgtEmptyGroup(m_nTempLay)
         RemoveBtn.IsEnabled = False
      End If
      CloseBtn.IsEnabled = True
      Point1Btn.IsEnabled = True
      SaveBtn.IsEnabled = False
      EgtDraw()
   End Sub

   Private Sub CloseBtn_Click(sender As Object, e As RoutedEventArgs) Handles CloseBtn.Click
      ' Se in modalità arco, devo aver già preso il punto intermedio
      If m_CurrCurveType = CurveType.ARC And m_nPrevPt <> 2 Then Return
      ' Recupero il punto iniziale del percorso
      Dim nPart As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_COPYTEMPLATE)
      Dim nOutloop As Integer = EgtGetFirstNameInGroup(nPart, NAME_OUTLOOP)
      If Not EgtStartPoint(EgtGetFirstInGroup(nOutloop), m_ptTipP1) Then Return
      ' Disegno l'entità di chiusura
      If m_CurrCurveType = CurveType.LINE Then
         CreateLine()
         m_nPrevPt = 0
      Else
         CreateArc()
         m_nPrevPt = 0
         LineBtn.IsEnabled = True
         RemoveBtn.IsEnabled = True
      End If
      ' Disattivo bottoni inserimento punti o chiusura
      Point1Btn.IsEnabled = False
      CloseBtn.IsEnabled = False
      ' Attivo salvataggio
      SaveBtn.IsEnabled = True
      ' Aggiorno visualizzazione
      EgtEmptyGroup(m_nTempLay)
      EgtDraw()
   End Sub

End Class
