Imports System.Runtime.InteropServices Imports EgtUILib Imports EgtWPFLib Public Class SimulationPageUC ' Riferimenti a pagine Private m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow) Private m_CurrProjPage As CurrentProjectPageUC ' Funzioni di callback per output in interfaccia da LUA Private m_ProcEventsCallback As New ProcessEventsCallback(AddressOf ProcessEvents) Private m_OutTextCallback As New OutTextCallback(AddressOf ProcessOutText) ' Stato di visualizzazione della macchina Private m_nMachLook As Integer = MCH_LOOK.ALL ' Stato ripartenza Private m_nRestart As Integer = 0 ' Utensile corrente Private m_sCurrTool As String = String.Empty ' Stato di comando corrente Private m_nStatus As MCH_SIM_ST = MCH_SIM_ST.UI_STOP ' Stato bottone Play Private m_bPlay As Boolean = True ' Coefficiente per valore Slider Private m_SliderX As Double = 1 ' Flag di esecuzione in corso Private m_bSimExecuting As Boolean = False Friend Function GetSimExecuting() As Boolean Return m_bSimExecuting End Function ' Numero di assi in simulazione Private m_SimulationAxesNum As Integer = 5 ' Flag di abilitazione della stima Private m_bEstim As Boolean = False Friend Sub ResetSimulation() ' Termino la simulazione SetStatus(MCH_SIM_ST.UI_STOP) EgtSimExit() ' Salvo valore dello slider Dim sVal As String = DoubleToString(SpeedSlider.Value, 1) WritePrivateProfileString(S_SIMUL, K_SLIDERVAL, sVal, m_MainWindow.GetIniFile()) ' Torno alla prima fase EgtSetCurrPhase(1, True) ' Ripristino visibilità standard EgtSetMachineLook(MCH_LOOK.TAB) ' Visualizzo eventuali testi con dati su aree m_CurrProjPage.SetAreasStatus( True) End Sub Private Sub SimulationPage_Initialized(sender As Object, e As EventArgs) ' Impostazioni box stime m_bEstim = (GetPrivateProfileInt(S_MACH_ESTIMATIONS, K_ENABLEEST, 0, m_MainWindow.GetMachIniFile()) <> 0) If Not m_bEstim Then EstimGrid.Visibility = Windows.Visibility.Hidden TimeTxBl.Text = EgtMsg(MSG_SIMULATIONPAGEUC + 15) ' Tempo CutLenTxBl.Text = EgtMsg(MSG_SIMULATIONPAGEUC + 16) ' Lunghezza NetAreaTxBl.Text = EgtMsg(MSG_SIMULATIONPAGEUC + 17) ' Area pezzi UsageTxBl.Text = EgtMsg(MSG_SIMULATIONPAGEUC + 18) ' Utilizzo ' Impostazioni box assi m_SimulationAxesNum = GetPrivateProfileInt(S_AXES, K_SIMULATIONAXESNUM, 5, m_MainWindow.GetMachIniFile()) For Index As Integer = 0 To AxesUniformGrid.Children.Count - 1 If Index > m_SimulationAxesNum - 1 And Index < AxesUniformGrid.Children.Count - 2 Then If TypeOf AxesUniformGrid.Children(Index) Is Grid Then Dim AxisGrid As Grid = DirectCast(AxesUniformGrid.Children(Index), Grid) AxisGrid.Visibility = Windows.Visibility.Collapsed End If End If Next If m_SimulationAxesNum <= 5 Then AxesUniformGrid.Rows = 7 AxesBoder.SetValue(Grid.RowSpanProperty, 2) AxesBoder.SetValue(Grid.RowProperty, 2) StepBtn.SetValue(Grid.RowProperty, 4) PlayPauseBtn.SetValue(Grid.RowProperty, 4) StopBtn.SetValue(Grid.RowProperty, 4) SpeedSlider.SetValue(Grid.RowProperty, 5) End If ' Pulsante Play PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/Play.png", UriKind.Relative)) ' abilito la visualizzazione del pulsante per la sola generazione del codice CN If GetPrivateProfileInt(S_GENERAL, K_GENERATECN, 0, m_MainWindow.GetIniFile()) <> 0 Then GenerateCN_Btn.Visibility = Visibility.Visible Else GenerateCN_Btn.Visibility = Visibility.Hidden End If End Sub Private Sub SimulationPage_Loaded(sender As Object, e As RoutedEventArgs) m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC Dim bOk As Boolean = True ' Elimino eventuale attrezzaggio da OmagOFFICE EgtEraseCurrSetup() ' Verifico l'attrezzaggio degli utensili utilizzati Dim sMissingTools As String = String.Empty Dim bSetup As Boolean = VerifySetup(sMissingTools) ' Costringo ad aggiornare UI UpdateUI() ' Aggiorno flag per lavaggio m_CurrProjPage.UpdateWashingFlag() ' Aggiorno flag per tastatura per tagli con angolo di fianco m_CurrProjPage.UpdateSideAngCutProbeFlag() ' Se pezzi piani e non taglio diretto e non c'è ordine delle lavorazioni, ricalcolo tutto e ne faccio uno automatico Dim nPrjType As Integer = m_CurrProjPage.GetCurrentProjectType() Dim bDirectCut As Boolean = (GetDirectCutPart() <> GDB_ID.NULL) If nPrjType = CurrentProjectPageUC.PRJ_TYPE.FLATS And Not bDirectCut And Not m_CurrProjPage.GetOrderMachiningFlag() Then ResetAllMachinings() bOk = SortAllMachinings() If bOk Then m_CurrProjPage.SetOrderMachiningFlag() Dim bModif As Boolean = TestAllMachiningsForStrict() If bModif Then m_CurrProjPage.SetWarningMessage(EgtMsg(90321)) 'Ridotte alcune lavorazioni per evitare interferenze Else m_CurrProjPage.SetInfoMessage(EgtMsg(90399)) 'Aggiornate tutte le lavorazioni End If End If ' Costringo ad aggiornare UI UpdateUI() ' Disabilito impostazione modificato EgtDisableModified() ' Aggiorno le lavorazioni bOk = UpdateAllMachiningsToolpaths() And bOk ' Eventuale eliminazione Home finale If bDirectCut And Not m_MainWindow.m_CurrentMachine.bDirectCutsFinalHome Then RemoveFinalHome() End If ' Aggiorno posizionamento ventose sui pezzi per eventuali tagli da sotto con lama bOk = UpdateVacuumsForDrip() And bOk ' Se errore in setup, lo segnalo If Not bSetup Then m_CurrProjPage.SetErrorMessage(EgtMsg(90322) & " " & sMissingTools) 'Mancano gli utensili : ... ' Se errore in generazione, segnalo l'errore ElseIf Not bOk Then m_CurrProjPage.SetErrorMessage(EgtMsg(90314)) 'Errore nella generazione del programma CN End If ' Costringo ad aggiornare UI UpdateUI() ' Se abilitate, eseguo la stima di tempi, lunghezze ... If m_bEstim Then EgtSetCurrPhase(1) EgtEstimate(m_MainWindow.GetTempDir() & "\MachProj.html", "OmagCut ver." & m_MainWindow.GetVersion()) ' Visualizzo i risultati Dim nTotalTime As Integer = 0 EgtGetInfo(EgtGetCurrMachGroup(), "Ttot", nTotalTime) Dim tsTotalTime As New TimeSpan(0, 0, nTotalTime) TimeTxBx.Text = tsTotalTime.ToString("hh\:mm\:ss") Dim dTotalLength As Double = 0 EgtGetInfo(EgtGetCurrMachGroup(), "Ltot", dTotalLength) If EgtUiUnitsAreMM() Then CutLenTxBx.Text = DoubleToString(dTotalLength / 1000, 1) & " m" Else CutLenTxBx.Text = DoubleToString(dTotalLength / (ONEINCH * 12), 1) & " ft" End If Dim dNetArea As Double = 0 EgtGetInfo(EgtGetCurrMachGroup(), "NetArea", dNetArea) If EgtUiUnitsAreMM() Then NetAreaTxBx.Text = DoubleToString(dNetArea / 1000000, 2) & " m²" Else NetAreaTxBx.Text = DoubleToString(dNetArea / (ONEINCH * 12 * ONEINCH * 12), 1) & " ft²" End If Dim dRawArea As Double = 0 EgtGetInfo(EgtGetCurrMachGroup(), "RawArea", dRawArea) Dim dUsage As Double = If(dRawArea > EPS_SMALL, dNetArea / dRawArea, 1) UsageTxBx.Text = DoubleToString(dUsage * 100, 1) & " %" End If ' Salvo il progetto con le lavorazioni Dim sMchPath As String = m_MainWindow.GetTempDir() & "\MachProj.nge" m_CurrProjPage.SaveFile(sMchPath, False) ' Nascondo eventuale contorno da foto m_CurrProjPage.ShowContour(False) ' Nascondo eventuali testi con dati su aree m_CurrProjPage.SetAreasStatus( false) ' Recupero eventuale fase di ripartenza m_nRestart = m_MainWindow.m_CurrentProjectPageUC.GetProjectNcRestart() ' Imposto prima fase EgtSetCurrPhase(1) ShowAllCurrPhaseMachinings() ' Costringo ad aggiornare UI UpdateUI() ' Visualizzo opportunamente la macchina m_nMachLook = MCH_LOOK.ALL EgtSetMachineLook(m_nMachLook) ' Imposto vista 3d isometrica di tutto EgtSetView(VT.ISO_SE, False) EgtZoom(ZM.ALL) ' Registro funzione su aggiornamento interfaccia da sotto EgtSetProcessEvents(m_ProcEventsCallback) EgtSetOutText(m_OutTextCallback) ' Avvio ambiente di simulazione EgtSimInit() EgtSimStart() ' Imposto stato corrente SetStatus(MCH_SIM_ST.UI_STOP) m_bPlay = True m_SliderX = GetPrivateProfileDouble(S_SIMUL, K_SLIDERX, 1, m_MainWindow.GetIniFile()) Dim SliderVal As Double = GetPrivateProfileDouble(S_SIMUL, K_SLIDERVAL, 10, m_MainWindow.GetIniFile()) SpeedSlider.Value = SliderVal EgtSimSetStep(SpeedSlider.Value * m_SliderX) ' Carico utensili specializzato LoadCurrTools() EgtDraw() ShowCncData() If (m_MainWindow.m_OptionsPageUC.ThemesCmBx.SelectedIndex = 0) Then PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/Play.png", UriKind.Relative)) Else PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/NewIcons/Play.png", UriKind.Relative)) End If End Sub Private Sub StepBtn_Click(sender As Object, e As RoutedEventArgs) Handles StepBtn.Click m_CurrProjPage.ClearMessage() ' Se stato stop, devo avviare simulazione If m_nStatus = MCH_SIM_ST.UI_STOP Then SetStatus(MCH_SIM_ST.UI_STEP) ExecSim() ' Aggiorno bottone SetPlayPauseBtnToPlay() ' Alrimenti imposto solo il nuovo stato Else SetStatus(MCH_SIM_ST.UI_STEP) ' Aggiornamenti per bottone Play/Pause SetPlayPauseBtnToPause() End If End Sub Private Sub PlayPauseBtn_Click(sender As Object, e As RoutedEventArgs) Handles PlayPauseBtn.Click m_CurrProjPage.ClearMessage() If m_bPlay Then ' Aggiorno bottone SetPlayPauseBtnToPause() ' Eseguo If m_nStatus = MCH_SIM_ST.UI_STOP Then ' Lancio simulazione SetStatus(MCH_SIM_ST.UI_PLAY) ExecSim() ' Aggiorno bottone SetPlayPauseBtnToPlay() ElseIf m_nStatus = MCH_SIM_ST.UI_PAUSE Then SetStatus(MCH_SIM_ST.UI_PLAY) End If Else ' Aggiorno bottone SetPlayPauseBtnToPlay() ' Se play o step, imposto stato pausa If m_nStatus = MCH_SIM_ST.UI_PLAY Or m_nStatus = MCH_SIM_ST.UI_STEP Then SetStatus(MCH_SIM_ST.UI_PAUSE) End If End If End Sub Private Sub SetPlayPauseBtnToPlay() m_bPlay = True If (m_MainWindow.m_OptionsPageUC.ThemesCmBx.SelectedIndex = 0) Then PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/Play.png", UriKind.Relative)) Else PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/NewIcons/Play.png", UriKind.Relative)) End If 'PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/Play.png", UriKind.Relative)) End Sub Private Sub SetPlayPauseBtnToPause() m_bPlay = False If (m_MainWindow.m_OptionsPageUC.ThemesCmBx.SelectedIndex = 0) Then PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/Pause.png", UriKind.Relative)) Else PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/NewIcons/Pause.png", UriKind.Relative)) End If 'PlayPauseImage.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/Resources/Pause.png", UriKind.Relative)) End Sub Private Sub StopBtn_Click(sender As Object, e As RoutedEventArgs) Handles StopBtn.Click m_CurrProjPage.ClearMessage() ' Se stato già stop, porto in home If m_nStatus = MCH_SIM_ST.UI_STOP Then ' Vado in home EgtSimHome() ' Imposto prima fase EgtSetCurrPhase(1, True) ' Aggiorno visualizzazione EgtDraw() ' Aggiorno dati CNC ShowCncData() End If ' Imposto il nuovo stato SetStatus(MCH_SIM_ST.UI_STOP) End Sub Private Sub SetStatus(nStatus As MCH_SIM_ST) m_nStatus = nStatus EgtSimSetUiStatus(m_nStatus) End Sub Private Sub SpeedSlider_ValueChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of Double)) If e.OldValue <> 0 Then EgtSimSetStep(SpeedSlider.Value * m_SliderX) End If End Sub Private Sub SkipForRestart() ' Se non c'è restart esco If m_nRestart = 0 Then Return ' Se tagli diretti restart non valido ed esco If GetDirectCutPart() <> GDB_ID.NULL Then Return ' Info m_CurrProjPage.SetInfoMessage( EgtMsg(90359) & " (" & m_nRestart.ToString() & ")") 'Restart (n) ' Salto While m_nStatus <> MCH_SIM_ST.UI_STOP ' Eseguo movimento Dim nMove As Integer Dim bMove As Boolean = EgtSimMove(nMove) If Not bMove Then Exit While ' Aggiorno visualizzazione e dati CNC (saltando le parti già fatte se in restart) Dim nPhase As Integer = EgtGetCurrPhase() Dim sOpeName As String = "" Dim nOpeType As Integer = 0 EgtSimGetOperationInfo( sOpeName, nOpeType) If ( nPhase = m_nRestart And nOpeType <> MCH_OY.DISP) Or nPhase > m_nRestart Then Exit While End If End While ' Aggiorno visualizzazione EgtDraw() ShowCncData() ' Info m_CurrProjPage.SetInfoMessage( EgtMsg(90359) & " (" & m_nRestart.ToString() & ")") 'Restart (n) ' Aspetto nuova partenza m_nStatus = MCH_SIM_ST.UI_PAUSE SetPlayPauseBtnToPlay() End Sub Private Sub ExecSim() m_bSimExecuting = True EgtSimStart( False) LoadCurrTools() SkipForRestart() EgtSimSetStep(SpeedSlider.Value * m_SliderX) While m_nStatus <> MCH_SIM_ST.UI_STOP ' Se simulazione in svolgimento If m_nStatus = MCH_SIM_ST.UI_PLAY Or m_nStatus = MCH_SIM_ST.UI_STEP Then ' Eseguo movimento Dim nMove As Integer Dim bMove As Boolean = EgtSimMove(nMove) ' Se arrivato a fine step e sono in step If bMove Then If m_nStatus = MCH_SIM_ST.UI_STEP And nMove = MCH_SIM.END_STEP Then ' Imposto stato Pausa SetStatus(MCH_SIM_ST.UI_PAUSE) ' Aggiornamenti per bottone Play/Pause SetPlayPauseBtnToPlay() End If ' Se movimento non riuscito Else SetStatus(MCH_SIM_ST.UI_STOP) ' Aggiornamenti per bottone Play/Pause SetPlayPauseBtnToPlay() Select Case nMove Case MCH_SIM.END_ m_CurrProjPage.SetInfoMessage(EgtMsg(MSG_SIMULATIONPAGEUC + 1)) 'Simulazione completata Case MCH_SIM.STOP_ ' Simulazione fermata dall'utente (non necessita messaggio) Case MCH_SIM.OUTSTROKE Dim sInfo As String = String.Empty EgtGetOutstrokeInfo(sInfo) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_SIMULATIONPAGEUC + 2) & " " & sInfo) 'Extracorsa ... Case MCH_SIM.DIR_ERR m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_SIMULATIONPAGEUC + 3)) 'Direzione utensile irraggiungibile Case Else If EgtGetLastMachMgrErrorId() <> 0 Then Dim sErr As String = EgtGetLastMachMgrErrorString() m_CurrProjPage.SetErrorMessage(sErr) Else m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_SIMULATIONPAGEUC + 4)) 'Errore End If End Select End If ' Aggiorno stato visualizzazione macchina (dipende anche da utensile) UpdateMachView() ' Aggiorno visualizzazione EgtDraw() ' Aggiorno dati CNC ShowCncData() Else ' Per evitare di ciclare rapidissimamente e consumare inutilmente CPU System.Threading.Thread.Sleep(1) End If ' Costringo ad aggiornare UI UpdateUI() End While m_bSimExecuting = False End Sub Private Sub ShowCncData() ' Assi Dim nInd As Integer = 0 ShowAxisNameVal(nInd, A1Name.Text, A1Value.Text) ShowAxisNameVal(nInd, A2Name.Text, A2Value.Text) ShowAxisNameVal(nInd, A3Name.Text, A3Value.Text) ShowAxisNameVal(nInd, A4Name.Text, A4Value.Text) ShowAxisNameVal(nInd, A5Name.Text, A5Value.Text) If m_SimulationAxesNum >= 6 Then ShowAxisNameVal(nInd, A6Name.Text, A6Value.Text) End If If m_SimulationAxesNum >= 7 Then ShowAxisNameVal(nInd, A7Name.Text, A7Value.Text) End If If m_SimulationAxesNum >= 8 Then ShowAxisNameVal(nInd, A8Name.Text, A8Value.Text) End If If m_SimulationAxesNum >= 9 Then ShowAxisNameVal(nInd, A9Name.Text, A9Value.Text) End If If m_SimulationAxesNum = 10 Then ShowAxisNameVal(nInd, A10Name.Text, A10Value.Text) End If ' Tipo di movimento e feed ShowMoveTypeFeed() ' Nome utensile e speed ShowToolNameSpeed() End Sub Private Function ShowAxisNameVal(ByRef nInd As Integer, ByRef sToken As String, ByRef sVal As String) As Boolean Dim sName As String = String.Empty Dim sInfo As String = String.Empty Dim bLinear As Boolean = True Dim dVal As Double = 0 If EgtSimGetAxisInfoPos(nInd, sName, sInfo, bLinear, dVal) Then If sInfo <> "**" Then sToken = sInfo sVal = If(bLinear, LenToString(dVal, -3), DoubleToString(dVal, -3)) nInd += 1 Return True Else nInd += 1 Return ShowAxisNameVal(nInd, sToken, sVal) End If Else sToken = String.Empty sVal = String.Empty nInd += 1 Return False End If End Function Private Function ShowMoveTypeFeed() As Boolean Dim nG As Integer = 0 Dim dFeed As Double = 0 If EgtSimGetMoveInfo(nG, dFeed) Then If nG <> 0 Then GCodeTxBl.Text = "G" & nG.ToString() FValueTxBl.Text = "F" & LenToString(dFeed, 0) Else GCodeTxBl.Text = "G" & nG.ToString() FValueTxBl.Text = "" End If Return True Else GCodeTxBl.Text = "" FValueTxBl.Text = "" Return False End If End Function Private Function ShowToolNameSpeed() As Boolean Dim sTool As String = String.Empty Dim dSpeed As Double = 0 If EgtSimGetToolInfo(sTool, dSpeed) Then TNameTxBl.Text = sTool SValueTxBl.Text = "S" & DoubleToString(dSpeed, 0) Return True Else TNameTxBl.Text = "" SValueTxBl.Text = "" Return False End If End Function Private Function LoadCurrTools() As Boolean ' Se macchina senza cambio utensile automatico devo caricare gli utensili If m_MainWindow.m_CurrentMachine.MountedToolConfig <> CurrentMachine.MountedToolConfigs.TOOLCHANGER Then ' Imposto la lama corrente Dim sSaw As String = m_MainWindow.m_CurrentMachine.sCurrSaw If Not EgtLoadTool("H1", 1, sSaw) Then Return False ' Imposto eventuale secondo utensile montato If m_MainWindow.m_CurrentMachine.MountedToolConfig = CurrentMachine.MountedToolConfigs.SAWANDAUXTOOL Then Dim sTool As String = m_MainWindow.m_CurrentMachine.sCurrDrill If String.IsNullOrEmpty(sTool) Then sTool = m_MainWindow.m_CurrentMachine.sCurrMill If Not String.IsNullOrEmpty(sTool) AndAlso Not EgtLoadTool("H1", 2, sTool) Then Return False End If ' Per MultiCut con TC manuale, impostazione eventuale secondo utensile montato su prima testa If EgtGetHeadId("H101") <> GDB_ID.NULL And m_MainWindow.m_CurrentMachine.MountedToolConfig = CurrentMachine.MountedToolConfigs.MANUALTOOLCHANGER And m_MainWindow.m_CurrentMachine.ManualToolChangerNbr > 0 Then Dim sTool As String = m_MainWindow.m_CurrentMachine.ManualToolChanger(0).sTool If Not String.IsNullOrEmpty(sTool) AndAlso Not EgtLoadTool("H1", 2, sTool) Then Return False End If End If ' Imposto eventuale lama per taglio da sotto Dim sDripSaw As String = m_MainWindow.m_CurrentMachine.sCurrDripSaw If Not String.IsNullOrEmpty(sDripSaw) Then EgtLoadTool("H105", 1, sDripSaw) End If ' Imposto eventuale foretto per foro da sotto Dim sDripDrill As String = m_MainWindow.m_CurrentMachine.sCurrDripDrill If Not String.IsNullOrEmpty(sDripDrill) Then EgtLoadTool("H106", 1, sDripDrill) End If Return True End Function Private Sub MachViewModeBtn_Click(sender As Object, e As RoutedEventArgs) Handles MachViewModeBtn.Click ' aggiorno lo stato Select Case m_nMachLook Case MCH_LOOK.ALL m_nMachLook = MCH_LOOK.TAB_HEAD Case MCH_LOOK.TAB_HEAD m_nMachLook = MCH_LOOK.TAB_TOOL Case Else m_nMachLook = MCH_LOOK.ALL End Select ' aggiorno lo stato della macchina e la sua visualizzazione EgtSetMachineLook(m_nMachLook) EgtDraw() End Sub Private Sub UpdateMachView() ' Se cambiato utensile, aggiorno stato visualizzazione macchina Dim sTool As String = String.Empty Dim dSpeed As Double = 0 If EgtSimGetToolInfo(sTool, dSpeed) Then If sTool <> m_sCurrTool Then m_sCurrTool = sTool EgtSetMachineLook(m_nMachLook) End If End If End Sub Private Sub ExitBtnUC_Click(sender As Object, e As RoutedEventArgs) ' Mi assicuro di terminare la simulazione ResetSimulation() ' Nascondo tutte le lavorazioni HideAllMachinings() ' Cancello eventuali messaggi m_CurrProjPage.ClearMessage() ' Imposto vista 2D EgtSetView(VT.TOP, False) EgtZoom(ZM.ALL) ' Abilito impostazione modificato EgtEnableModified() ' Reset funzione callback su evento aggiornamento interfaccia da sotto EgtSetProcessEvents(Nothing) EgtSetOutText(Nothing) ' Esco dalla pagina m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Remove(Me) m_CurrProjPage.CurrProjGrid.Visibility = Windows.Visibility.Visible If m_MainWindow.m_PrevActivePage = MainWindow.Pages.CadCut Then m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_MainWindow.m_CadCutPageUC) m_MainWindow.m_ActivePage = MainWindow.Pages.CadCut ElseIf m_MainWindow.m_PrevActivePage = MainWindow.Pages.FrameCut Then m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_MainWindow.m_FrameCutPageUC) m_MainWindow.m_ActivePage = MainWindow.Pages.FrameCut Else m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_MainWindow.m_DirectCutPageUC) m_MainWindow.m_ActivePage = MainWindow.Pages.DirectCut End If End Sub Private Sub GenerateXPIUC_Click(sender As Object, e As RoutedEventArgs) ' se il bottone Shift è premuto apro il file CadCut1 nel programma NotePad Dim IsPressedShiftKey As Boolean = False If Keyboard.Modifiers And ModifierKeys.Shift Then IsPressedShiftKey = True End If Dim bOk As Boolean = True EgtSetCurrentContext(m_CurrProjPage.CurrentProjectScene.GetCtx()) ' Elimino eventuale attrezzaggio da OmagOFFICE EgtEraseCurrSetup() ' Verifico l'attrezzaggio degli utensili utilizzati Dim sMissingTools As String = String.Empty If Not VerifySetup(sMissingTools) Then m_CurrProjPage.SetErrorMessage(EgtMsg(90322) & " " & sMissingTools) 'Mancano gli utensili : ... Return End If ' Costringo ad aggiornare UI UpdateUI() ' Aggiorno flag per lavaggio m_CurrProjPage.UpdateWashingFlag() ' Aggiorno flag per tastatura per tagli con angolo di fianco m_CurrProjPage.UpdateSideAngCutProbeFlag() ' Se pezzi piani e non c'è ordine delle lavorazioni, ricalcolo tutto e ne faccio uno automatico Dim nPrjType As Integer = m_CurrProjPage.GetCurrentProjectType() Dim bDirectCut As Boolean = (GetDirectCutPart() <> GDB_ID.NULL) If nPrjType = CurrentProjectPageUC.PRJ_TYPE.FLATS And Not bDirectCut And Not m_CurrProjPage.GetOrderMachiningFlag() Then ResetAllMachinings() bOk = SortAllMachinings() If bOk Then m_CurrProjPage.SetOrderMachiningFlag() Dim bModif As Boolean = TestAllMachiningsForStrict() If bModif Then m_CurrProjPage.SetWarningMessage(EgtMsg(90321)) 'Ridotte alcune lavorazioni per evitare interferenze Else m_CurrProjPage.SetInfoMessage(EgtMsg(90399)) 'Aggiornate tutte le lavorazioni End If EgtDraw() End If End If ' Costringo ad aggiornare UI UpdateUI() ' Disabilito impostazione modificato EgtDisableModified() ' Aggiorno le lavorazioni bOk = UpdateAllMachiningsToolpaths() And bOk ' Aggiorno posizionamento ventose sui pezzi per eventuali tagli da sotto con lama bOk = UpdateVacuumsForDrip() And bOk ' Costringo ad aggiornare UI UpdateUI() ' Inserisco indice di progetto m_CurrProjPage.SetProjectIndexFlag() ' Inserisco il materiale m_CurrProjPage.SetProjectMaterial() ' Salvo il progetto con le lavorazioni Dim sMchPath As String = m_MainWindow.GetTempDir() & "\MachProj.nge" m_CurrProjPage.SaveFile(sMchPath) ' Costringo ad aggiornare UI UpdateUI() ' Se modalità Ufficio, copio il progetto ed esco If m_MainWindow.GetKeyOption(MainWindow.KEY_OPT.OFFICE_TYPE) Then ' Ripristino come fase corrente quella iniziale EgtSetCurrPhase(1) ' Chiedo il nome del file esportato Dim MySaveNameWD As New SaveNameWD(m_MainWindow, SaveNameWD.SAVE_TYPE.PRJ_COPY) MySaveNameWD.ShowDialog() Return End If ' Se presente ripartenza, ne chiedo conferma Dim nPhaseRestart As Integer = m_CurrProjPage.GetProjectNcRestart() If nPhaseRestart <> 0 Then ' Confermi ripartenza dalla fase NNN ? Dim AskNcRestart As New EgtMsgBox(m_MainWindow, "", String.Format(EgtMsg(90326), nPhaseRestart), EgtMsgBox.Buttons.YES_NO_CANCEL, EgtMsgBox.Icons.NULL, 2) Select Case AskNcRestart.m_nPressedBtn Case 1 ' YES Case 2 ' NO EgtEnableModified() m_CurrProjPage.ResetProjectNcRestart() nPhaseRestart = 0 EgtDisableModified() Case Else ' CANCEL Return End Select End If ' Se abilitate, eseguo le stime If GetPrivateProfileInt(S_MACH_ESTIMATIONS, K_ENABLEEST, 0, m_MainWindow.GetMachIniFile()) <> 0 Then EgtEstimate(m_MainWindow.GetTempDir() & "\MachProj.html", "OmagCut ver." & m_MainWindow.GetVersion()) End If ' Genero file CNC (lancio anche se errore in precedenza) -> recupero la tavola corrente! CamAuto.GetCurrentTable() Dim nIndexTab As Integer = CamAuto.GetCurrentTable() Dim sIndexTab As String = String.Empty If nIndexTab > 0 Then sIndexTab = nIndexTab.ToString End If Dim sFileName As String = "CadCut" & sIndexTab Dim sCncPath As String = m_MainWindow.GetCncDir() & "\" & sFileName & m_MainWindow.m_CurrentMachine.sIsoFileExt bOk = EgtGenerate(sCncPath, "OmagCut ver." & m_MainWindow.GetVersion()) And bOk ' Costringo ad aggiornare UI UpdateUI() ' Ripristino come fase corrente quella iniziale EgtSetCurrPhase(1) If bOk Then m_CurrProjPage.SetInfoMessage("Genarato file " & sFileName & m_MainWindow.m_CurrentMachine.sIsoFileExt) Else m_CurrProjPage.SetErrorMessage(EgtMsg(90314)) 'Errore nella generazione del programma CN End If ' procedo all'apertura del file CadCut1 apenna generato (solo se generazione corretta) If bOk And IsPressedShiftKey Then Try Process.Start("Notepad.exe", sCncPath) Catch ex As Exception EgtOutLog(ex.ToString) End Try End If End Sub Private Function ProcessEvents(nProg As Integer, nPause As Integer) As Integer ' Visualizzo assi ShowCncData() ' Costringo ad aggiornare UI UpdateUI() Return 0 End Function Private Function ProcessOutText(ByRef psText As IntPtr) As Boolean ' Emetto stringa di testo Dim sText As String = (Marshal.PtrToStringUni(psText)) If Not String.IsNullOrWhiteSpace(sText) Then m_CurrProjPage.SetInfoMessage(sText) Else m_CurrProjPage.ClearMessage() End If ' Costringo ad aggiornare UI UpdateUI() Return True End Function End Class