diff --git a/CadCutPageUC.xaml.vb b/CadCutPageUC.xaml.vb index 5e23cb4..de6fa90 100644 --- a/CadCutPageUC.xaml.vb +++ b/CadCutPageUC.xaml.vb @@ -70,7 +70,7 @@ Public Class CadCutPageUC Private Sub RawPartBtn_Click(sender As Object, e As RoutedEventArgs) Handles RawPartBtn.Click m_MainWindow.m_CurrentProjectPageUC.CurrProjGrid.Visibility = Windows.Visibility.Hidden - m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Remove(m_MainWindow.m_CadCutPageUC) + m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Remove(Me) m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_MainWindow.m_RawPartPage) m_MainWindow.m_ActivePage = MainWindow.Pages.RawPart End Sub diff --git a/DirectCutPageUC.xaml b/DirectCutPageUC.xaml index 6aaf64b..6f57bb3 100644 --- a/DirectCutPageUC.xaml +++ b/DirectCutPageUC.xaml @@ -36,13 +36,16 @@ - + + + + + + + + diff --git a/GridCut.xaml.vb b/GridCut.xaml.vb new file mode 100644 index 0000000..c5ac324 --- /dev/null +++ b/GridCut.xaml.vb @@ -0,0 +1,549 @@ +Imports EgtUILib + +Public Class GridCut + ' 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 + ' Lato di creazione dei tagli + Private m_bCutSide As CutSide = CutSide.Left + ' 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 Enum CutSide As Integer + Left + Right + End Enum + + Private Sub MultipleCut_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC + ' Reset punto acquisito + m_bPointP1Ok = False + 'SawTipTxBl.Text = String.Empty + ' Assegno parametri di lavorazione già definiti + DepthTxBx.Text = DoubleToString(m_dDepth, 1) + LenghtTxBx.Text = DoubleToString(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 MultipleCut_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded + ' 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 + ' 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" & DoubleToString(m_ptTipP1.x, 0) & " Y" & DoubleToString(m_ptTipP1.y, 0) & + " Z" & DoubleToString(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 + CreateMultipleCut() + 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 + ' 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" & DoubleToString(m_ptTipP2.x, 0) & " Y" & DoubleToString(m_ptTipP2.y, 0) & + " Z" & DoubleToString(m_ptTipP2.z, 0) & " C" & DoubleToString(dR1, 0) & + " B" & DoubleToString(dR2, 0) + 'SawTipTxBl.Text = sSawTip + ' Assegno angolo verticale da direzione utensile + 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 + LenghtTxBx.Text = DoubleToString(dLen, 1) + m_dAngO = dAngOrizzDeg + DirectionTxBx.Text = DoubleToString(dAngOrizzDeg, 2) + Create2PointsMultipleCut() + EgtShowOnlyTable(False) + EgtDraw() + ' Seleziono il bottone per indicare che il secondo punto è stato acquisito + Point2Btn.IsChecked = True + Else + ' 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 + StringToDouble(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 = DoubleToString(m_dDepth, 2) + ' Disegno il taglio + CreateMultipleCut() + 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 + StringToDouble(LenghtTxBx.Text, dLenght) + If dLenght < MIN_CUT_LEN Then + m_dLen = MIN_CUT_LEN + Else + m_dLen = dLenght + End If + LenghtTxBx.Text = DoubleToString(m_dLen, 2) + ' Disegno il taglio + CreateMultipleCut() + 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 + CreateMultipleCut() + 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 < 0 Then + m_dAngV = 0 + 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 + CreateMultipleCut() + 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 CreateMultipleCut() 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 Integer = 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", m_dDepth) + EgtSetInfo(nCutId, "SideAng", m_dAngV) + ' Funzione che crea i tagli successivi al primo + MultiplyCut(nLayerId, nCutId) + ' 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 Create2PointsMultipleCut() 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 Integer = 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", m_dDepth) + EgtSetInfo(nCutId, "SideAng", m_dAngV) + ' Funzione che crea i tagli successivi al primo + MultiplyCut(nLayerId, nCutId) + ' 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 MultiplyCut(nLayerId As Integer, nCutId As Integer) + ' Recupero spessore della lama correntemente attiva + Dim dThick As Double = 0 + EgtTdbGetCurrToolParam(MCH_TP.THICK, dThick) + ' Ricalcolo lo spessore della lama in base all'inclinazione + dThick = dThick / Math.Cos(m_dAngV * Math.PI / 180) + ' Imposto angolo di rotazione a seconda del lato dei tagli + Dim dRotAngO As Double = If(SideChBx.IsChecked, -90, 90) + 'Variabile che contiene la somma degli spostamenti + Dim dTotPerpMove As Vector3d + ' Definisco vettore di spostamento + Dim vtDelta As Vector3d + ' Calcolo primo vettore di spostamento + Dim dDimPz1 As Double + Dim nNumPz1 As Integer + StringToDouble(DimPz1TxBx.Text, dDimPz1) + StringToDouble(NumPz1TxBx.Text, nNumPz1) + If dDimPz1 <> 0 And nNumPz1 > 0 Then + vtDelta = Vector3d.FromPolar((dDimPz1 + dThick), m_dAngO) + vtDelta.Rotate(Vector3d.Z_AX, dRotAngO) + For Index As Integer = 1 To nNumPz1 + Dim vtPerpMove As Vector3d = Index * vtDelta + ' Creo copie + Dim nCut2Id = EgtCopyGlob(nCutId, nLayerId) + EgtMove(nCut2Id, vtPerpMove, GDB_RT.GLOB) + Next + dTotPerpMove += vtDelta * nNumPz1 + End If + ' Calcolo secondo vettore di spostamento + Dim dDimPz2 As Double + Dim nNumPz2 As Integer + StringToDouble(DimPz2TxBx.Text, dDimPz2) + StringToDouble(NumPz2TxBx.Text, nNumPz2) + If dDimPz2 <> 0 And nNumPz2 > 0 Then + vtDelta = Vector3d.FromPolar((dDimPz2 + dThick), m_dAngO) + vtDelta.Rotate(Vector3d.Z_AX, dRotAngO) + For Index As Integer = 1 To nNumPz2 + Dim vtPerpMove As Vector3d = dTotPerpMove + vtDelta * Index + ' Creo copie + Dim nCut3Id = EgtCopyGlob(nCutId, nLayerId) + EgtMove(nCut3Id, vtPerpMove, GDB_RT.GLOB) + Next + dTotPerpMove += vtDelta * nNumPz2 + End If + ' Calcolo terzo vettore di spostamento + Dim dDimPz3 As Double + Dim nNumPz3 As Integer + StringToDouble(DimPz3TxBx.Text, dDimPz3) + StringToDouble(NumPz3TxBx.Text, nNumPz3) + If dDimPz3 <> 0 And nNumPz3 > 0 Then + vtDelta = Vector3d.FromPolar((dDimPz3 + dThick), m_dAngO) + vtDelta.Rotate(Vector3d.Z_AX, dRotAngO) + For Index As Integer = 1 To nNumPz3 + Dim vtPerpMove As Vector3d = dTotPerpMove + vtDelta * Index + ' Creo copie + Dim nCut4Id = EgtCopyGlob(nCutId, nLayerId) + EgtMove(nCut4Id, vtPerpMove, GDB_RT.GLOB) + Next + dTotPerpMove += vtDelta * nNumPz3 + End If + Return True + 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 + + Private Sub NumPz1TxBx_EgtClosed(sender As Object, e As EventArgs) Handles NumPz1TxBx.EgtClosed, NumPz2TxBx.EgtClosed, NumPz3TxBx.EgtClosed, DimPz1TxBx.EgtClosed, DimPz2TxBx.EgtClosed, DimPz3TxBx.EgtClosed, SideChBx.Click + ' Disegno il taglio + If m_bPointP2Ok Then + Create2PointsMultipleCut() + Else + CreateMultipleCut() + End If + EgtDraw() + End Sub + +End Class \ No newline at end of file diff --git a/M_Num.vb b/M_Num.vb index 8a32ceb..db78c0d 100644 --- a/M_Num.vb +++ b/M_Num.vb @@ -7,6 +7,7 @@ Imports System.Linq Imports System.Text Imports System.Windows.Forms Imports EgtUILib +Imports EgtWPFLib Namespace Num Public Class NumNC @@ -117,22 +118,24 @@ Namespace Num Private m_nCnDataVarNum As Integer = 0 Private m_nCnDataVarInd(NUM_DATA - 1) As Integer + Private m_ConnectionError5000 As Boolean = False + #End Region #Region " Constructor" - Sub New() - n_state = 0 - sz_NC_error_messages = New List(Of String) - End Sub + Sub New() + n_state = 0 + sz_NC_error_messages = New List(Of String) + End Sub - Public Overrides Function Init() As Boolean + Public Overrides Function Init() As Boolean - ' Initialize and start Runtime System - InitFxServer() + ' Initialize and start Runtime System + InitFxServer() - Return n_state >= 2 - End Function + Return n_state >= 2 + End Function #End Region @@ -152,31 +155,37 @@ Namespace Num Dim Index As Integer = 0 - Dim SaveCurrProj As New SaveCurrProjWD + Dim ConnectionWnd As New EgtMsgBox(Application.Current.MainWindow, "CONNESSIONE AL CN", "Connessione in corso...", True, EgtMsgBox.Icons.NULL, 1) + ConnectionWnd.LoadingPrBr_Value = 5 - While n_state < 2 And Index < 20 - If Index = 0 Then - SaveCurrProj.sTextString = "Collegamento in corso" - SaveCurrProj.Show() - End If + Dim ConnectionError As Integer = 0 + + While (n_state < 2 Or m_ConnectionError5000) And Index < 20 System.Threading.Thread.Sleep(500) ' 0.5 sec wait + ConnectionWnd.LoadingPrBr_Value += 5 Index += 1 + ' Costringo ad aggiornare GUI + Dim nDummy As Integer + Application.Current.Dispatcher.Invoke(Windows.Threading.DispatcherPriority.Background, New Action(Function() nDummy = 0)) End While - If n_state < 2 Then - SaveCurrProj.Close() - SaveCurrProj = New SaveCurrProjWD - SaveCurrProj.sTextString = "Collegamento non riuscito" - SaveCurrProj.Show() - System.Threading.Thread.Sleep(2000) ' 2 sec wait - SaveCurrProj.Close() + If n_state < 2 Or m_ConnectionError5000 Then + ConnectionWnd.Text = "Connessione non riuscita" + ' Costringo ad aggiornare GUI + Dim nDummy As Integer + Application.Current.Dispatcher.Invoke(Windows.Threading.DispatcherPriority.Background, New Action(Function() nDummy = 0)) + + System.Threading.Thread.Sleep(1500) ' 2 sec wait + ConnectionWnd.Close() Else - SaveCurrProj.Close() - SaveCurrProj = New SaveCurrProjWD - SaveCurrProj.sTextString = "Collegamento riuscito" - SaveCurrProj.Show() - System.Threading.Thread.Sleep(2000) ' 2 sec wait - SaveCurrProj.Close() + ConnectionWnd.Text = "Connessione riuscita" + ConnectionWnd.LoadingPrBr_Value = 100 + ' Costringo ad aggiornare GUI + Dim nDummy As Integer + Application.Current.Dispatcher.Invoke(Windows.Threading.DispatcherPriority.Background, New Action(Function() nDummy = 0)) + + System.Threading.Thread.Sleep(1500) ' 2 sec wait + ConnectionWnd.Close() ' lancio della lettura delle variabili PLC set_Read_PLC_var() @@ -534,7 +543,10 @@ Namespace Num ' ' ------->> FXServer Event DGroupManager ErrorHandler ' Private Sub objDGroupManager_ErrorHandler(szError As String, nTextNumber As Short) Handles objDGroupManager.ErrorHandler - MessageBox.Show("DGroupManager.ErrorHandler message : " & szError & "ErrorHandler number : " & nTextNumber.ToString) + EgtOutLog("DGroupManager.ErrorHandler message : " & szError & "ErrorHandler number : " & nTextNumber.ToString) + If nTextNumber = 5000 Then + m_ConnectionError5000 = True + End If End Sub #End Region @@ -966,7 +978,7 @@ Namespace Num d_DInterpo_Feed_override = CDbl(CLng(values(n))) * 0.47059 b_feed_changed = True Case CnData.Speed ' (4) Speed - d_spindle_eff(0) = CDbl(values(n)) + d_spindle_eff(0) = CDbl(values(n)) Case CnData.SpeedOvr ' (5) Potenziom. speed = ... n_spindle_override(0) = Math.Round((CDbl(values(n)) * 50 / 255) + 50) Case CnData.Power ' (6) Ampère = * 0.01 diff --git a/MainWindow.xaml.vb b/MainWindow.xaml.vb index 4fd1981..f18bd00 100644 --- a/MainWindow.xaml.vb +++ b/MainWindow.xaml.vb @@ -756,6 +756,9 @@ Class MainWindow ' Non devo fare alcunchè End Select End If + If m_ActivePage = Pages.DirectCut And m_DirectCutPageUC.m_ActiveDirectCutPage = DirectCutPageUC.DirectCutPages.SingleCut Then + m_DirectCutPageUC.m_SingleCut.SingleCut_Unloaded(sender, e) + End If MainWindow_Unloaded(sender, e) Me.Close() End Sub diff --git a/MultipleCut.xaml b/MultipleCut.xaml new file mode 100644 index 0000000..cc16fac --- /dev/null +++ b/MultipleCut.xaml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MultipleCut.xaml.vb b/MultipleCut.xaml.vb new file mode 100644 index 0000000..73651e0 --- /dev/null +++ b/MultipleCut.xaml.vb @@ -0,0 +1,550 @@ +Imports EgtUILib + +Public Class MultipleCut + + ' 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 + ' Lato di creazione dei tagli + Private m_bCutSide As CutSide = CutSide.Left + ' 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 Enum CutSide As Integer + Left + Right + End Enum + + Private Sub MultipleCut_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC + ' Reset punto acquisito + m_bPointP1Ok = False + 'SawTipTxBl.Text = String.Empty + ' Assegno parametri di lavorazione già definiti + DepthTxBx.Text = DoubleToString(m_dDepth, 1) + LenghtTxBx.Text = DoubleToString(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 MultipleCut_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded + ' 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 + ' 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" & DoubleToString(m_ptTipP1.x, 0) & " Y" & DoubleToString(m_ptTipP1.y, 0) & + " Z" & DoubleToString(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 + CreateMultipleCut() + 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 + ' 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" & DoubleToString(m_ptTipP2.x, 0) & " Y" & DoubleToString(m_ptTipP2.y, 0) & + " Z" & DoubleToString(m_ptTipP2.z, 0) & " C" & DoubleToString(dR1, 0) & + " B" & DoubleToString(dR2, 0) + 'SawTipTxBl.Text = sSawTip + ' Assegno angolo verticale da direzione utensile + 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 + LenghtTxBx.Text = DoubleToString(dLen, 1) + m_dAngO = dAngOrizzDeg + DirectionTxBx.Text = DoubleToString(dAngOrizzDeg, 2) + Create2PointsMultipleCut() + EgtShowOnlyTable(False) + EgtDraw() + ' Seleziono il bottone per indicare che il secondo punto è stato acquisito + Point2Btn.IsChecked = True + Else + ' 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 + StringToDouble(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 = DoubleToString(m_dDepth, 2) + ' Disegno il taglio + CreateMultipleCut() + 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 + StringToDouble(LenghtTxBx.Text, dLenght) + If dLenght < MIN_CUT_LEN Then + m_dLen = MIN_CUT_LEN + Else + m_dLen = dLenght + End If + LenghtTxBx.Text = DoubleToString(m_dLen, 2) + ' Disegno il taglio + CreateMultipleCut() + 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 + CreateMultipleCut() + 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 < 0 Then + m_dAngV = 0 + 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 + CreateMultipleCut() + 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 CreateMultipleCut() 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 Integer = 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", m_dDepth) + EgtSetInfo(nCutId, "SideAng", m_dAngV) + ' Funzione che crea i tagli successivi al primo + MultiplyCut(nLayerId, nCutId) + ' 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 Create2PointsMultipleCut() 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 Integer = 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", m_dDepth) + EgtSetInfo(nCutId, "SideAng", m_dAngV) + ' Funzione che crea i tagli successivi al primo + MultiplyCut(nLayerId, nCutId) + ' 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 MultiplyCut(nLayerId As Integer, nCutId As Integer) + ' Recupero spessore della lama correntemente attiva + Dim dThick As Double = 0 + EgtTdbGetCurrToolParam(MCH_TP.THICK, dThick) + ' Ricalcolo lo spessore della lama in base all'inclinazione + dThick = dThick / Math.Cos(m_dAngV * Math.PI / 180) + ' Imposto angolo di rotazione a seconda del lato dei tagli + Dim dRotAngO As Double = If(SideChBx.IsChecked, -90, 90) + 'Variabile che contiene la somma degli spostamenti + Dim dTotPerpMove As Vector3d + ' Definisco vettore di spostamento + Dim vtDelta As Vector3d + ' Calcolo primo vettore di spostamento + Dim dDimPz1 As Double + Dim nNumPz1 As Integer + StringToDouble(DimPz1TxBx.Text, dDimPz1) + StringToDouble(NumPz1TxBx.Text, nNumPz1) + If dDimPz1 <> 0 And nNumPz1 > 0 Then + vtDelta = Vector3d.FromPolar((dDimPz1 + dThick), m_dAngO) + vtDelta.Rotate(Vector3d.Z_AX, dRotAngO) + For Index As Integer = 1 To nNumPz1 + Dim vtPerpMove As Vector3d = Index * vtDelta + ' Creo copie + Dim nCut2Id = EgtCopyGlob(nCutId, nLayerId) + EgtMove(nCut2Id, vtPerpMove, GDB_RT.GLOB) + Next + dTotPerpMove += vtDelta * nNumPz1 + End If + ' Calcolo secondo vettore di spostamento + Dim dDimPz2 As Double + Dim nNumPz2 As Integer + StringToDouble(DimPz2TxBx.Text, dDimPz2) + StringToDouble(NumPz2TxBx.Text, nNumPz2) + If dDimPz2 <> 0 And nNumPz2 > 0 Then + vtDelta = Vector3d.FromPolar((dDimPz2 + dThick), m_dAngO) + vtDelta.Rotate(Vector3d.Z_AX, dRotAngO) + For Index As Integer = 1 To nNumPz2 + Dim vtPerpMove As Vector3d = dTotPerpMove + vtDelta * Index + ' Creo copie + Dim nCut3Id = EgtCopyGlob(nCutId, nLayerId) + EgtMove(nCut3Id, vtPerpMove, GDB_RT.GLOB) + Next + dTotPerpMove += vtDelta * nNumPz2 + End If + ' Calcolo terzo vettore di spostamento + Dim dDimPz3 As Double + Dim nNumPz3 As Integer + StringToDouble(DimPz3TxBx.Text, dDimPz3) + StringToDouble(NumPz3TxBx.Text, nNumPz3) + If dDimPz3 <> 0 And nNumPz3 > 0 Then + vtDelta = Vector3d.FromPolar((dDimPz3 + dThick), m_dAngO) + vtDelta.Rotate(Vector3d.Z_AX, dRotAngO) + For Index As Integer = 1 To nNumPz3 + Dim vtPerpMove As Vector3d = dTotPerpMove + vtDelta * Index + ' Creo copie + Dim nCut4Id = EgtCopyGlob(nCutId, nLayerId) + EgtMove(nCut4Id, vtPerpMove, GDB_RT.GLOB) + Next + dTotPerpMove += vtDelta * nNumPz3 + End If + Return True + 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 + + Private Sub NumPz1TxBx_EgtClosed(sender As Object, e As EventArgs) Handles NumPz1TxBx.EgtClosed, NumPz2TxBx.EgtClosed, NumPz3TxBx.EgtClosed, DimPz1TxBx.EgtClosed, DimPz2TxBx.EgtClosed, DimPz3TxBx.EgtClosed, SideChBx.Click + ' Disegno il taglio + If m_bPointP2Ok Then + Create2PointsMultipleCut() + Else + CreateMultipleCut() + End If + EgtDraw() + End Sub + +End Class \ No newline at end of file diff --git a/NestPageUC.xaml b/NestPageUC.xaml index 77e35c2..645a5ac 100644 --- a/NestPageUC.xaml +++ b/NestPageUC.xaml @@ -44,7 +44,7 @@ VerticalAlignment="Center" /> + Style="{StaticResource OmagCut_YellowIconToggleButton}"> diff --git a/OmagCUT.vbproj b/OmagCUT.vbproj index 2f32195..9bd2288 100644 --- a/OmagCUT.vbproj +++ b/OmagCUT.vbproj @@ -149,6 +149,9 @@ FrameCutPageUC.xaml + + GridCut.xaml + Keyboard.xaml @@ -161,6 +164,9 @@ ManualAxesMoveUC.xaml + + MultipleCut.xaml + @@ -258,6 +264,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + MSBuild:Compile Designer @@ -274,6 +284,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/OmagCUTDictionary.xaml b/OmagCUTDictionary.xaml index 95e89e1..2ea254f 100644 --- a/OmagCUTDictionary.xaml +++ b/OmagCUTDictionary.xaml @@ -422,18 +422,29 @@ - + diff --git a/SingleCutUC.xaml b/SingleCutUC.xaml index 3e7638e..358a1a3 100644 --- a/SingleCutUC.xaml +++ b/SingleCutUC.xaml @@ -34,10 +34,20 @@ - -