Imports System.Runtime.InteropServices Imports EgtUILib 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) System.Threading.Thread.Sleep(250) 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(90565) ' Tempo CutLenTxBl.Text = EgtMsg(90566) ' Lunghezza NetAreaTxBl.Text = EgtMsg(90567) ' Area pezzi UsageTxBl.Text = EgtMsg(90568) ' 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 generazione del codice CN (se previsto) 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) EgtOutLog(" -- PREPARE SIMUL --") m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC Dim bOk As Boolean = True ' 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) ' 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() ' 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 Dim nIdBase As Integer = EgtGetBaseId("Base") Dim m_nIdMinRedX = EgtGetFirstNameInGroup(nIdBase, "MinRedX") If m_nIdMinRedX <> GDB_ID.NULL Then EgtSetStatus(m_nIdMinRedX, GDB_ST.OFF) Dim m_nIdMinRedY = EgtGetFirstNameInGroup(nIdBase, "MinRedY") If m_nIdMinRedY <> GDB_ID.NULL Then EgtSetStatus(m_nIdMinRedY, GDB_ST.OFF) EgtOutLog(" -- END PREPARE SIMUL --") 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(90551)) ' 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(90552) & " " & sInfo) ' Extracorsa ... Case MCH_SIM.DIR_ERR m_CurrProjPage.SetErrorMessage(EgtMsg(90553)) ' Direzione utensile irraggiungibile Case Else If EgtGetLastMachMgrErrorId() <> 0 Then Dim sErr As String = EgtGetLastMachMgrErrorString() m_CurrProjPage.SetErrorMessage(sErr) Else m_CurrProjPage.SetErrorMessage(EgtMsg(90554)) ' 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 And m_MainWindow.m_CurrentMachine.MountedToolConfig <> CurrentMachine.MountedToolConfigs.TOOLCHANGERWITHSAW 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 ExitBtn_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 GenerateCN_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 ' Eventualmente fermo la simulazione m_nStatus = MCH_SIM_ST.UI_STOP m_bPlay = False PlayPauseBtn_Click(Nothing, Nothing) ' Se versione ufficio non genero If m_MainWindow.GetKeyOption(MainWindow.KEY_OPT.OFFICE_TYPE) Then m_CurrProjPage.SetWarningMessage("Office Version") Return End If EgtSetCurrentContext(m_CurrProjPage.CurrentProjectScene.GetCtx()) ' 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() ' Nome e path del file CN da generare Dim sFileName As String = "" ' Se in Tagli Diretti If m_MainWindow.DirectCutBtn.IsChecked And Not m_MainWindow.CadCutBtn.IsChecked Then sFileName = "DirectCut" ' Altrimenti in Tagli Cad Else Dim nIndexTab As Integer = CamAuto.GetCurrentTable() Dim sIndexTab As String = If(nIndexTab > 0, nIndexTab.ToString, "") sFileName = "CadCut" & sIndexTab End If Dim sCncPath As String = m_MainWindow.GetCncDir() & "\" & sFileName & m_MainWindow.m_CurrentMachine.sIsoFileExt ' Genero file CNC Dim bOk As Boolean = EgtGenerate(sCncPath, "OmagCut ver." & m_MainWindow.GetVersion()) ' Costringo ad aggiornare UI UpdateUI() ' Ripristino come fase corrente quella iniziale EgtSetCurrPhase(1) If bOk Then m_CurrProjPage.SetInfoMessage(EgtMsg(90571) & sFileName & m_MainWindow.m_CurrentMachine.sIsoFileExt) ' Genarato file Else m_CurrProjPage.SetErrorMessage(EgtMsg(90314)) ' Errore nella generazione del programma CN End If ' procedo all'apertura del file CadCut1 appena 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 ' ricarico la pagina di simulazione EgtSetCurrPhase(1) ' nascondo i pezzi in parcheggio HideParkedParts(True) ' Avvio ambiente di simulazione EgtSimInit() EgtSimStart() ' Imposto stato corrente SetStatus(MCH_SIM_ST.UI_STOP) m_bPlay = True ' Costringo ad aggiornare UI UpdateUI() 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