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.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 10) LineBtn.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 50) ArcBtn.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 51) RemoveBtn.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 52) CloseBtn.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 53) SaveBtn.Content = 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) 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