Files
OmagCUT/SingleCutUC.xaml.vb
T
Dario Sassi 3eb8929578 OmagCUT :
- aggiunta gestione mm/inch in interfaccia utente (da fare verso macchina e in generazione CN).
2016-01-19 18:01:10 +00:00

482 lines
19 KiB
VB.net

Imports EgtUILib
Public Class SingleCutUC
' Riferimenti a pagine
Private m_MainWindow As MainWindow = Application.Current.MainWindow
Private m_CurrProjPage As CurrentProjectPageUC
' Origine tavola e dati grezzo
Private m_bRawOk As Boolean = False
Private m_ptTabOri As Point3d
Private m_ptRawMin As Point3d
Private m_ptRawMax As Point3d
' Parametri P1 acquisito
Private m_bPointP1Ok As Boolean = False
Private m_ptTipP1 As Point3d
Private m_vtToolP1 As Vector3d
' Parametri P2 acquisito
Private m_bPointP2Ok As Boolean = False
Private m_ptTipP2 As Point3d
Private m_vtToolP2 As Vector3d
' Parametri della lavorazione
Private m_bCutOk As Boolean = False
Private m_dDepth As Double = 0
Private m_dLen As Double = 1000
Private m_dAngO As Double = 180
Private m_dAngV As Double = 0
' Costanti
Private Const MAX_TAB_DEPTH As Double = 10.0
Private Const MIN_CUT_LEN As Double = 10.0
Private Const MAX_SIDE_ANG As Double = 60.0
Private Const DIRECTCUT As String = "DirectCut"
Private Sub SingleCut_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
Point1Btn.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 10)
Point2Btn.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 11)
LaserOnChBx.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 12)
DepthTxBl.Text = EgtMsg(MSG_DIRECTCUTPAGEUC + 13)
LenghtTxBl.Text = EgtMsg(MSG_DIRECTCUTPAGEUC + 14)
DirectionTxBl.Text = EgtMsg(MSG_DIRECTCUTPAGEUC + 15)
SideAngleTxBl.Text = EgtMsg(MSG_DIRECTCUTPAGEUC + 16)
OkBtn.Content = EgtMsg(MSG_DIRECTCUTPAGEUC + 30)
End Sub
Private Sub SingleCut_Loaded(sender As Object, e As RoutedEventArgs)
m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC
' Reset punto acquisito
m_bPointP1Ok = False
SawTipTxBl.Text = String.Empty
' Assegno parametri di lavorazione già definiti
DepthTxBx.Text = LenToString(m_dDepth, 1)
LenghtTxBx.Text = LenToString(m_dLen, 1)
' Origine tavola
m_bRawOk = True
If Not EgtGetTableRef(1, m_ptTabOri) Then
m_bRawOk = False
EgtOutLog("Error on TableRef1")
End If
' Dati del grezzo
If Not m_MainWindow.m_RawPartPage.GetRawBox(m_ptRawMin, m_ptRawMax) Then
m_bRawOk = False
EgtOutLog("Error on RawBox")
End If
' Reset taglio e disabilito bottone esecuzione
m_bCutOk = False
UpdateOkBtn()
' Disabilito bottone secondo punto
Point2Btn.IsEnabled = False
' Deseleziono bottone primo punto
Point1Btn.IsChecked = False
' Disabilito registrazione progetto modificato
EgtDisableModified()
End Sub
Friend Sub SingleCut_Unloaded(sender As Object, e As RoutedEventArgs)
' Rimuovo eventuale pezzo per taglio diretto
EraseDirectCutPart()
' Riattivo eventuali lavorazioni presenti
ActivateAllMachinings()
' Abilito registrazione progetto modificato
EgtEnableModified()
' Nascondo la macchina
EgtShowOnlyTable(True)
EgtDraw()
End Sub
Private Sub UpdateOkBtn()
If m_bCutOk Then
OkBtn.IsEnabled = True
OkBtn.Foreground = Brushes.Black
Else
OkBtn.IsEnabled = False
OkBtn.Foreground = Brushes.DarkGray
End If
End Sub
Private Sub Point1Btn_Click(sender As Object, e As RoutedEventArgs) Handles Point1Btn.Click
' Reset punto non acquisito
m_bPointP1Ok = False
SawTipTxBl.Text = String.Empty
' Verifico configurazione tavola e grezzo
If Not m_bRawOk Then
Return
End If
' 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 = String.Empty
GetPrivateProfileString(S_MACH, K_CURRSAW, "", sSaw, m_MainWindow.GetIniFile())
' Se punto da laser
If LaserOnChBx.IsChecked Then
' Imposto come testa corrente il laser (senza utensile ovviamente)
If Not EgtSetCalcTool("", "H3", 1) Then
Return
End If
' Trasformo in posizione punta utensile in basso
If Not EgtGetCalcTipFromPositions(dL1, dL2, dL3, dR1, dR2, True, m_ptTipP1) Then
Return
End If
' Ora imposto la lama corrente
If Not EgtSetCalcTool(sSaw, "H1", 1) Then
Return
End If
' Altrimenti da lama
Else
' Imposto la lama corrente
If Not EgtSetCalcTool(sSaw, "H1", 1) Then
Return
End If
' Trasformo in posizione punta utensile in basso
If Not EgtGetCalcTipFromPositions(dL1, dL2, dL3, dR1, dR2, True, m_ptTipP1) Then
Return
End If
End If
' Calcolo direzione asse lama
If Not EgtGetCalcToolDirFromAngles(dR1, dR2, m_vtToolP1) Then
Return
End If
' Porto il tip nell'origine tavola
m_ptTipP1.ToLoc(New Frame3d(m_ptTabOri))
m_bPointP1Ok = True
' Recupero il nome degli assi macchina
Dim sL1 As String = String.Empty
Dim sL2 As String = String.Empty
Dim sL3 As String = String.Empty
Dim sR1 As String = String.Empty
Dim sR2 As String = String.Empty
m_MainWindow.m_CNCommunication.GetAxesNames(sL1, sL2, sL3, sR1, sR2)
' Visualizzo macchina in posizione
EgtSetAxisPos(sL1, dL1)
EgtSetAxisPos(sL2, dL2)
EgtSetAxisPos(sL3, dL3)
EgtSetAxisPos(sR1, dR1)
EgtSetAxisPos(sR2, dR2)
' Visualizzo quote
Dim sSawTip As String = "X" & LenToString(m_ptTipP1.x, 0) & " Y" & LenToString(m_ptTipP1.y, 0) &
" Z" & LenToString(m_ptTipP1.z, 0) & " C" & DoubleToString(dR1, 0) &
" B" & DoubleToString(dR2, 0)
SawTipTxBl.Text = sSawTip
' Assegno angoli
Dim dTLen, dTAngV, dTAngO As Double
m_vtToolP1.ToSpherical(dTLen, dTAngV, dTAngO)
m_dAngO = dTAngO + 90
m_dAngV = 90 - dTAngV
DirectionTxBx.Text = DoubleToString(m_dAngO, 2)
SideAngleTxBx.Text = DoubleToString(m_dAngV, 2)
' Disegno il taglio
CreateSingleCut()
EgtShowOnlyTable(False)
EgtDraw()
' Seleziono il bottone per indicare che il primo punto è stato acquisito
Point1Btn.IsChecked = True
' Abilito e deseleziono secondo punto
Point2Btn.IsEnabled = True
Point2Btn.IsChecked = False
' Annullo secondo punto selezionato
m_bPointP2Ok = False
End Sub
Private Sub Point2Btn_Click(sender As Object, e As RoutedEventArgs) Handles Point2Btn.Click
' Deseleziono il bottone (poichè si seleziona automaticamente) cos' nel caso ci sia un errore rimane deselezionato
Point2Btn.IsChecked = False
' Reset punto non acquisito
m_bPointP2Ok = False
SawTipTxBl.Text = String.Empty
' Verifico configurazione tavola e grezzo
If Not m_bRawOk Then
Return
End If
' 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 = String.Empty
GetPrivateProfileString(S_MACH, K_CURRSAW, "", sSaw, m_MainWindow.GetIniFile())
' Se punto da laser
If LaserOnChBx.IsChecked Then
' Imposto come testa corrente il laser (senza utensile ovviamente)
If Not EgtSetCalcTool("", "H3", 1) Then
Return
End If
' Trasformo in posizione punta utensile in basso
If Not EgtGetCalcTipFromPositions(dL1, dL2, dL3, dR1, dR2, True, m_ptTipP2) Then
Return
End If
' Ora imposto la lama corrente
If Not EgtSetCalcTool(sSaw, "H1", 1) Then
Return
End If
' Altrimenti da lama
Else
' Imposto la lama corrente
If Not EgtSetCalcTool(sSaw, "H1", 1) Then
Return
End If
' Trasformo in posizione punta utensile in basso
If Not EgtGetCalcTipFromPositions(dL1, dL2, dL3, dR1, dR2, True, m_ptTipP2) Then
Return
End If
End If
' Calcolo direzione asse lama
If Not EgtGetCalcToolDirFromAngles(dR1, dR2, m_vtToolP2) Then
Return
End If
' Porto il tip nell'origine tavola
m_ptTipP2.ToLoc(New Frame3d(m_ptTabOri))
m_bPointP2Ok = True
' Recupero il nome degli assi macchina
Dim sL1 As String = String.Empty
Dim sL2 As String = String.Empty
Dim sL3 As String = String.Empty
Dim sR1 As String = String.Empty
Dim sR2 As String = String.Empty
m_MainWindow.m_CNCommunication.GetAxesNames(sL1, sL2, sL3, sR1, sR2)
' Visualizzo macchina in posizione
EgtSetAxisPos(sL1, dL1)
EgtSetAxisPos(sL2, dL2)
EgtSetAxisPos(sL3, dL3)
EgtSetAxisPos(sR1, dR1)
EgtSetAxisPos(sR2, dR2)
' Visualizzo quote
Dim sSawTip As String = "X" & LenToString(m_ptTipP2.x, 0) & " Y" & LenToString(m_ptTipP2.y, 0) &
" Z" & LenToString(m_ptTipP2.z, 0) & " C" & DoubleToString(dR1, 0) &
" B" & DoubleToString(dR2, 0)
SawTipTxBl.Text = sSawTip
' Assegno angoli
Dim dTLen, dTAngV, dTAngO As Double
m_vtToolP2.ToSpherical(dTLen, dTAngV, dTAngO)
m_dAngV = 90 - dTAngV
SideAngleTxBx.Text = DoubleToString(m_dAngV, 2)
' Se il secondo punto non coincide con il primo, disegno il taglio
Dim vtDiff As Vector3d = m_ptTipP2 - m_ptTipP1
vtDiff.z = 0
Dim dLen As Double
Dim dAngVertDeg As Double
Dim dAngOrizzDeg As Double
vtDiff.ToSpherical(dLen, dAngVertDeg, dAngOrizzDeg)
If dLen > EPS_SMALL Then
m_dLen = dLen
m_dAngO = dAngOrizzDeg
LenghtTxBx.Text = LenToString(m_dLen, 1)
DirectionTxBx.Text = DoubleToString(m_dAngO, 2)
Create2PointsCut()
EgtShowOnlyTable(False)
EgtDraw()
' Seleziono il bottone per indicare che il secondo punto è stato acquisito
Point2Btn.IsChecked = True
Else
Point1Btn_Click(sender, e)
' Deseleziono il bottone per indicare che il secondo punto non è stato acquisito perchè uguale al primo
Point2Btn.IsChecked = False
End If
End Sub
Private Sub DepthTxBx_EgtClosed(sender As Object, e As EventArgs) Handles DepthTxBx.EgtClosed
' Verifico che l'affondamento impostato non sia superiore a quello massimo
Dim dMaxDepth = m_ptRawMax.z - m_ptRawMin.z + MAX_TAB_DEPTH
Dim dDepth As Double = 0
StringToLen(DepthTxBx.Text, dDepth)
If dDepth < 0 Then
m_dDepth = 0
ElseIf dDepth > dMaxDepth Then
m_dDepth = dMaxDepth
Else
m_dDepth = dDepth
End If
DepthTxBx.Text = LenToString(m_dDepth, 2)
' Disegno il taglio
CreateSingleCut()
EgtDraw()
End Sub
Private Sub LenghtTxBx_EgtClosed(sender As Object, e As EventArgs) Handles LenghtTxBx.EgtClosed
' Verifico che la lunghezza del taglio impostata non sia inferiore a quella minima
Dim dLenght As Double = 0
StringToLen(LenghtTxBx.Text, dLenght)
If dLenght < MIN_CUT_LEN Then
m_dLen = MIN_CUT_LEN
Else
m_dLen = dLenght
End If
LenghtTxBx.Text = LenToString(m_dLen, 2)
' Disegno il taglio
CreateSingleCut()
EgtDraw()
End Sub
Private Sub DirectionTxBx_EgtClosed(sender As Object, e As EventArgs) Handles DirectionTxBx.EgtClosed
' Assegno il nuovo valore di direzione
Dim dDirection As Double = 0
StringToDouble(DirectionTxBx.Text, dDirection)
m_dAngO = dDirection
' Disegno il taglio
CreateSingleCut()
EgtDraw()
End Sub
Private Sub SideAngleTxBx_EgtClosed(sender As Object, e As EventArgs) Handles SideAngleTxBx.EgtClosed
' Verifico che l'inclinazione del taglio impostata non sia superiore a quella massima
Dim dSideAngle As Double = 0
StringToDouble(SideAngleTxBx.Text, dSideAngle)
If dSideAngle < -MAX_SIDE_ANG Then
m_dAngV = -MAX_SIDE_ANG
ElseIf dSideAngle > MAX_SIDE_ANG Then
m_dAngV = MAX_SIDE_ANG
Else
m_dAngV = dSideAngle
End If
SideAngleTxBx.Text = DoubleToString(m_dAngV, 2)
' Disegno il taglio
CreateSingleCut()
EgtDraw()
End Sub
Private Sub OkBtn_Click(sender As Object, e As RoutedEventArgs) Handles OkBtn.Click
' Verifico ci sia un taglio valido
If Not m_bCutOk Then
Return
End If
' Salvo il progetto con le lavorazioni
Dim sMchPath As String = m_MainWindow.GetTempDir() & "\" & "DirectProj.nge"
m_MainWindow.m_CurrentProjectPageUC.SaveFile(sMchPath)
' Genero file CNC (lancio anche se errore in precedenza)
Dim sCncPath As String = m_MainWindow.GetCncDir() & "\DirectCut.xpi"
Dim bOk As Boolean = EgtGenerate(sCncPath, "OmagCut")
' Se errore in generazione, segnalo l'errore ed esco
If Not bOk Then
m_CurrProjPage.SetErrorMessage(EgtMsg(90314)) 'Errore nella generazione del programma CN
Return
End If
' Download programma (eventuali errori sono segnalati dalla funzione)
If m_MainWindow.m_CNCommunication.SendProgram(sCncPath, 900) Then
' copio il progetto corrente come progetto in lavorazione
Dim sWrkPath As String = m_MainWindow.GetTempDir() & "\" & "WorkProj.nge"
My.Computer.FileSystem.CopyFile(sMchPath, sWrkPath, True)
End If
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 CreateSingleCut() As Boolean
' Verifico sia definito il punto iniziale e il grezzo
If Not m_bPointP1Ok Or Not m_bRawOk Then
m_bCutOk = False
Return False
End If
' Spessore grezzo
Dim dRawHeight As Double = m_ptRawMax.z - m_ptRawMin.z
' Rimuovo eventuale vecchio pezzo per taglio diretto
EraseDirectCutPart()
' Disattivo eventuali lavorazioni presenti
DeactivateAllMachinings()
' Creo nuovo pezzo per il taglio diretto
Dim nPartId = EgtCreateGroup(GDB_ID.ROOT)
EgtSetName(nPartId, DIRECTCUT)
Dim nLayerId = EgtCreateGroup(nPartId)
EgtSetName(nLayerId, "OutLoop")
' Creo il taglio
Dim ptStart As Point3d = m_ptTipP1
ptStart.z = 0
Dim nCutId = EgtCreateLinePDL(nLayerId, ptStart, m_dAngO, m_dLen)
' Imposto affondamento e angolo di fianco sul taglio
EgtSetInfo(nCutId, "Depth", DoubleToString(m_dDepth, 3))
EgtSetInfo(nCutId, "SideAng", DoubleToString(m_dAngV, 3))
' Creo layer per crocetta di riferimento
Dim nCrossLayerId = EgtCreateGroup(nPartId)
' Aggiungo crocetta
CreateCross(nCrossLayerId, ptStart)
' Calcolo punto di inserimento nel grezzo
Dim ptMin, ptMax As Point3d
EgtGetBBoxGlob(nPartId, GDB_BB.STANDARD, ptMin, ptMax)
Dim ptIns As Point3d = ptMin + (m_ptTabOri - m_ptRawMin)
ptIns.z = dRawHeight
' Inserisco il pezzo nel grezzo
EgtAddPartToRawPart(nPartId, ptIns, m_MainWindow.m_CurrentProjectPageUC.m_nRawId)
' Inserisco la lavorazione
m_bCutOk = AddMachinings(nPartId, True, True)
UpdateOkBtn()
Return m_bCutOk
End Function
Private Function Create2PointsCut() As Boolean
' Verifico siano definiti punto iniziale punto finale e grezzo
If Not m_bPointP1Ok Or Not m_bPointP2Ok Or Not m_bRawOk Then
m_bCutOk = False
Return False
End If
' Spessore grezzo
Dim dRawHeight As Double = m_ptRawMax.z - m_ptRawMin.z
' Rimuovo eventuale vecchio pezzo per taglio diretto
EraseDirectCutPart()
' Disattivo eventuali lavorazioni presenti
DeactivateAllMachinings()
' Creo nuovo pezzo per il taglio diretto
Dim nPartId = EgtCreateGroup(GDB_ID.ROOT)
EgtSetName(nPartId, DIRECTCUT)
' Creo layer di taglio
Dim nLayerId = EgtCreateGroup(nPartId)
EgtSetName(nLayerId, "OutLoop")
' Creo il taglio
Dim ptStart As Point3d = m_ptTipP1
Dim ptEnd As Point3d = m_ptTipP2
ptStart.z = 0
ptEnd.z = 0
Dim nCutId = EgtCreateLine(nLayerId, ptStart, ptEnd)
' Imposto affondamento e angolo di fianco sul taglio
EgtSetInfo(nCutId, "Depth", DoubleToString(m_dDepth, 3))
EgtSetInfo(nCutId, "SideAng", DoubleToString(m_dAngV, 3))
' Creo layer per crocette di riferimento
Dim nCrossLayerId = EgtCreateGroup(nPartId)
' Aggiungo crocette
CreateCross(nCrossLayerId, ptStart)
CreateCross(nCrossLayerId, ptEnd)
' Calcolo punto di inserimento nel grezzo
Dim ptMin, ptMax As Point3d
EgtGetBBoxGlob(nPartId, GDB_BB.STANDARD, ptMin, ptMax)
Dim ptIns As Point3d = ptMin + (m_ptTabOri - m_ptRawMin)
ptIns.z = dRawHeight
' Inserisco il pezzo nel grezzo
EgtAddPartToRawPart(nPartId, ptIns, m_MainWindow.m_CurrentProjectPageUC.m_nRawId)
' Inserisco la lavorazione
m_bCutOk = AddMachinings(nPartId, True, True)
UpdateOkBtn()
Return m_bCutOk
End Function
Private Function EraseDirectCutPart()
' Recupero identificativo del pezzo
Dim nDirPartId As Integer = EgtGetFirstNameInGroup(m_MainWindow.m_CurrentProjectPageUC.m_nRawId, DIRECTCUT)
If nDirPartId = GDB_ID.NULL Then
Return True
End If
' Cancello le lavorazioni
EraseMachinings(nDirPartId)
' Tolgo il pezzo dal grezzo
EgtRemovePartFromRawPart(nDirPartId)
' Cancello il pezzo
EgtErase(nDirPartId)
Return True
End Function
Private Function CreateCross(nLayerId As Integer, ptP As Point3d) 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)
EgtSetColor(nCrossId1, New Color3d(255, 0, 0))
Dim nCrossId2 = EgtCreateLine(nLayerId, ptP + (-vtCrossY), ptP + vtCrossY)
EgtSetColor(nCrossId2, New Color3d(255, 0, 0))
Return True
End Function
End Class