Files
EgtCAM5/OptionPanel/MachiningOptionPanel/SimulationExpander/SimulationExpanderVM.vb
T
Dario Sassi a7dc65f10e EgtCAM5 2.6b4 :
- in simulazione migliorata gestione errori dopo EgtSimulStart
- nella toolbar di Vista aggiunto anche comando IsoViewSE.
2024-02-19 14:58:17 +01:00

435 lines
18 KiB
VB.net

Imports System.Collections.ObjectModel
Imports System.IO
Imports EgtUILib
Imports EgtWPFLib5
Public Class SimulationExpanderVM
Inherits SimulationVM
#Region "FIELDS & PROPERTIES"
'GRAPHICAL PROPERTIES
Private m_Simulation_IsExpanded As Boolean
Public Overridable Property Simulation_IsExpanded As Boolean
Get
Return m_Simulation_IsExpanded
End Get
Set(value As Boolean)
If value <> m_Simulation_IsExpanded Then
Map.refMachiningOptionPanelVM.Set_IsExpanded(MachiningOptionPanelVM.MachiningOptionPanelExpander.SIMULATION, value)
End If
End Set
End Property
Private m_Simulation_IsEnabled As Boolean = False
Public Property Simulation_IsEnabled As Boolean
Get
Return m_Simulation_IsEnabled
End Get
Set(value As Boolean)
m_Simulation_IsEnabled = value
NotifyPropertyChanged("Simulation_IsEnabled")
End Set
End Property
Public Overrides Property SliderValue As Double
Get
Return m_SliderValue
End Get
Set(value As Double)
value = Math.Max(1, Math.Min(value, 100))
If Math.Abs(value - m_SliderValue) > 1 Then
m_SliderValue = value
NotifyPropertyChanged("SliderValue")
End If
EgtSimSetStep(value * GetSliderX())
End Set
End Property
Private m_bStopOnNextCollision As Boolean = True
#End Region ' FIELDS & PROPERTIES
#Region "CONSTRUCTOR"
Sub New()
SetRefSimulationExpanderVM(Me)
SimulationMsg_Const = MSG_SIMULATION
SetPlayImagePath("/Resources/OptionPanel/MachiningOptionPanel/SimulationExpander/Play.png")
SetPauseImagePath("/Resources/OptionPanel/MachiningOptionPanel/SimulationExpander/Pause.png")
SetPauseMsg(EgtMsg(5311)) ' PAUSA
SetStopMsg(EgtMsg(5312)) ' STOP
SetHomeMsg(EgtMsg(5314)) ' HOME
End Sub
#End Region ' CONSTRUCTOR
#Region "COMMANDS"
#Region "GenerateCommand"
''' <summary>
''' Creata the new tool. This method is invoked by the NewCommand.
''' </summary>
Public Sub Generate(ByVal param As Object)
' Verifico se richiesta anche visualizzazione del CN
Dim bNcView As Boolean = ((Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift)
' Recupero la fase corrente
Dim nPhase As Integer = EgtGetCurrPhase()
' Aggiorno le lavorazioni
If Not UpdateAllMachinings() Then
EgtSetCurrPhase(If(nPhase = 0, 1, nPhase), True)
Return
End If
' Recupero nome file CN (dopo aver verificato salvataggio progetto)
Dim sCncFile As String = ""
Dim sInfo As String = ""
If Not GetCncFileName(True, sCncFile, sInfo) Then Return
' Eseguo
If Not EgtGenerate(sCncFile, sInfo) Then
Dim nErr = EgtGetLastMachMgrErrorId()
If nErr = 1000 Then
MessageBox.Show(EgtMsg(5333), EgtMsg(5320), MessageBoxButton.OK, MessageBoxImage.Information)
ElseIf nErr <> 0 Then
Dim sErr As String = EgtGetLastMachMgrErrorString()
MessageBox.Show(sErr, EgtMsg(5305), MessageBoxButton.OK, MessageBoxImage.Exclamation)
Else
MessageBox.Show(EgtMsg(5306), EgtMsg(5305), MessageBoxButton.OK, MessageBoxImage.Error)
End If
bNcView = False
Else
Map.refStatusBarVM.NotifyStatusOutput(EgtMsg(5332) & " (" & sCncFile & ")")
End If
' Torno alla fase originale (o alla prima se non definita)
EgtSetCurrPhase(If(nPhase = 0, 1, nPhase), True)
' Se richiesta anche la visualizzazione del CN corrente, procedo
If bNcView Then
' Se esiste ne lancio l'editing
If File.Exists(sCncFile) Then
Process.Start("Notepad.exe", sCncFile)
' altrimenti lo segnalo
Else
Map.refStatusBarVM.NotifyStatusOutput("Edit failed, missing part program file" & " (" & sCncFile & ")")
End If
End If
End Sub
#End Region ' GenerateCommand
#End Region ' COMMANDS
#Region "METHODS"
Friend Function InitSimulation() As Boolean
EgtDeselectAll()
Map.refInstrumentPanelVM.GetDistIsChecked = False
' Disabilito la selezione dei Percorsi di Lavorazione
Map.refProjectVM.SceneSelType = SceneSelTypeOpt.NULL
' Disabilito la selezione di tutti i tipi di geometria
Map.refProjectVM.SceneSelMode = SceneSelModeOpt.NULL
Map.refTopCommandBarVM.SaveIsEnabled = False
SelData.ClearIdSub()
If IniFile.m_bShowOnlyTable Then
EgtShowOnlyTable(False)
EgtZoom(ZM.ALL, False)
End If
InitializeSimulation()
EgtDraw()
m_Simulation_IsExpanded = True
Map.refOperationParametersExpanderVM.OperParamsViewIsEnabled = False
Map.refOperationsListExpanderVM.SimulationExpander_Get_IsExpanded(True)
NotifyPropertyChanged("Simulation_IsExpanded")
Map.refMachiningOptionPanelVM.OnPropertyChanged("GenerateIsEnabled")
' disattivo database utensili, lavorazioni e setup se vado in simulazione
Map.refMachinePanelVM.ToolMachSetUpIsEnabled(False, False, False)
' disattivo MTable e SpecialPanel se vado in simulazione
Map.refDoorPanelVM.MTableIsEnabled(False)
Map.refSpecialPanelVM.SpecialPanelIsEnabled(False)
Return True
End Function
Friend Function ExitSimulation() As Boolean
If bSimExecuting Then Return False
ResetSimulation()
If IniFile.m_bShowOnlyTable Then
EgtShowOnlyTable(True)
EgtZoom(ZM.ALL)
End If
Map.refTopCommandBarVM.SaveIsEnabled = True
m_Simulation_IsExpanded = False
Map.refOperationParametersExpanderVM.OperParamsViewIsEnabled = True
Map.refOperationsListExpanderVM.SimulationExpander_Get_IsExpanded(False)
NotifyPropertyChanged("Simulation_IsExpanded")
Map.refMachiningOptionPanelVM.OnPropertyChanged("GenerateIsEnabled")
' attivo database utensili, lavorazioni e setup se esco dalla simulazione
Map.refMachinePanelVM.ToolMachSetUpIsEnabled(True, True, True)
' disattivo MTable e SpecialPanel se esco dalla simulazione
Map.refDoorPanelVM.MTableIsEnabled(True)
Map.refSpecialPanelVM.SpecialPanelIsEnabled(True)
Return True
End Function
Friend Function UpdateAllMachinings() As Boolean
' Se disabilitato, esco
If GetPrivateProfileInt( S_MACH, K_AUTOUPDATEALLMACHININGS, 1) = 0 Then Return True
' Eseguo ricalcolo
Dim bModified As Boolean = EgtGetModified()
Dim sErr As String = String.Empty
Dim bOk As Boolean = EgtApplyAllMachinings(False, False, sErr)
' In caso di errori, li segnalo
If Not bOk Then
If Not String.IsNullOrEmpty(sErr) Then
MessageBox.Show(sErr, EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Exclamation)
Else
MessageBox.Show(EgtMsg(MSG_SIMULATION + 6), EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Error)
End If
End If
If Not bModified Then EgtResetModified()
Return bOk
End Function
Private Sub InitializeSimulation()
' Recupero la fase corrente
Dim nPhase As Integer = EgtGetCurrPhase()
' Aggiorno le lavorazioni
If Not UpdateAllMachinings() Then EgtSetCurrPhase(If(nPhase = 0, 1, nPhase), True)
' Inizio simulazione
Dim bOk As Boolean = EgtSimInit() AndAlso EgtSimStart()
' Costringo ad aggiornare UI
UpdateUI()
' Messaggio in caso di errore
If Not bOk Then
If EgtGetLastMachMgrErrorId() <> 0 Then
Dim sErr As String = EgtGetLastMachMgrErrorString()
MessageBox.Show(sErr, EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Exclamation) '.... - ERRORE
Else
MessageBox.Show(EgtMsg(MSG_MESSAGEBOX + 10), EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Error) 'Errore sconosciuto - ERRORE
End If
End If
' Imposto stato corrente
SetSimulationStatus(MCH_SIM_ST.UI_STOP)
SetShowPlay(True)
SetSliderX(GetPrivateProfileDouble(S_SIMUL, K_SLIDERX, 1))
Dim SliderVal As Double = GetPrivateProfileDouble(S_SIMUL, K_SLIDERVAL, 10)
SliderValue = SliderVal
' Gestione check VMill
If IsKeyEnabledVirtualMilling() And EgtUILib.GetPrivateProfileInt(S_VMILL, K_VM_ENABLE, 0, m_sCurrMachIniFilePath) <> 0 Then
VMill_Visibility = Visibility.Visible
VMill_IsEnabled = True
Dim bVal As Boolean
SetVMillActive(EgtGetInfo(EgtGetCurrMachGroup(), KEY_MCHGRP_VM, bVal) And bVal)
Else
VMill_Visibility = Visibility.Collapsed
VMill_IsEnabled = False
' Disabilito Vmill, ma inibisco dichiarazione progetto modificato
EgtDisableModified()
VMillActive = False
EgtEnableModified()
End If
' Aggiorno visualizzazione dati macchina
ShowCncData()
StatusMsg = EgtMsg(MSG_SIMULATION + 14) ' HOME
End Sub
Public Overrides Sub ExecSim()
SetSimExecuting(True)
IniFile.m_bSimulExecuting = True
Map.refTopCommandBarVM.DrawIsEnabled = False
Map.refOperationsListExpanderVM.OpersListViewIsEnabled = False
Map.refOperationParametersExpanderVM.OperParamsViewIsEnabled = False
Map.refMachGroupPanelVM.SetMachGroupState(False) ' Map.refMachGroupPanelVM.MachGroupPanelIsEnabled = False
Map.refEstimationsExpanderVM.NotifyPropertyChanged("Estimation_IsEnabled")
m_bStopOnNextCollision = True
If Not EgtSimStart(False) Then
If EgtGetLastMachMgrErrorId() <> 0 Then
Dim sErr As String = EgtGetLastMachMgrErrorString()
MessageBox.Show(sErr, EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Exclamation) '.... - ERRORE
Else
MessageBox.Show(EgtMsg(MSG_MESSAGEBOX + 10), EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Error) 'Errore sconosciuto - ERRORE
End If
SetSimulationStatus(MCH_SIM_ST.UI_STOP)
End If
Dim nShowDataCounter As Integer = 0
While GetStatus() <> MCH_SIM_ST.UI_STOP
' Se simulazione in svolgimento
If GetStatus() = MCH_SIM_ST.UI_PLAY Or GetStatus() = 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 GetStatus() = MCH_SIM_ST.UI_STEP And nMove = MCH_SIM.END_STEP Then
' Imposto stato Pausa
SetSimulationStatus(MCH_SIM_ST.UI_PAUSE)
StatusMsg = EgtMsg(MSG_SIMULATION + 11) ' PAUSA
' Aggiornamenti per bottone Play/Pause
SetShowPlay(True)
NotifyPropertyChanged("PlayPauseImage")
End If
' Se movimento con collisione
ElseIf nMove = MCH_SIM.COLLISION Then
If m_bStopOnNextCollision Then
' Imposto stato Pausa
SetSimulationStatus(MCH_SIM_ST.UI_PAUSE)
StatusMsg = EgtMsg(MSG_SIMULATION + 11) ' PAUSA
' Aggiornamenti per bottone Play/Pause
SetShowPlay(True)
NotifyPropertyChanged("PlayPauseImage")
' Messaggio
MessageBox.Show(EgtMsg(MSG_SIMULATION + 19), EgtMsg(MSG_SIMULATION + 15), MessageBoxButton.OK, MessageBoxImage.Warning)
Else
m_bStopOnNextCollision = True
End If
' Altrimenti movimento non riuscito
Else
SetSimulationStatus(MCH_SIM_ST.UI_STOP)
' Aggiornamenti per bottone Play/Pause
SetShowPlay(True)
NotifyPropertyChanged("PlayPauseImage")
' Abilito check VMill
VMill_IsEnabled = True
Select Case nMove
Case MCH_SIM.END_
StatusMsg = EgtMsg(MSG_SIMULATION + 1) ' END
Case MCH_SIM.STOP_
' Simulazione fermata dall'utente (non necessita messaggio)
Case MCH_SIM.OUTSTROKE
Dim sInfo As String = String.Empty
EgtGetOutstrokeInfo(sInfo)
MessageBox.Show(EgtMsg(MSG_SIMULATION + 2) & " " & sInfo, EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Stop) 'Extracorsa ...
Case MCH_SIM.DIR_ERR
MessageBox.Show(EgtMsg(MSG_SIMULATION + 3), EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Stop) 'Direzione utensile irraggiungibile
Case Else
If EgtGetLastMachMgrErrorId() <> 0 Then
Dim sErr As String = EgtGetLastMachMgrErrorString()
MessageBox.Show(sErr, EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Exclamation) '.... - ERRORE
Else
MessageBox.Show(EgtMsg(MSG_SIMULATION + 4), EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Error) 'Errore - ERRORE
End If
End Select
End If
' Aggiorno stato visualizzazione macchina (dipende anche da utensile)
UpdateMachView()
' Aggiorno visualizzazione
EgtDraw()
' Aggiorno dati CNC
If nShowDataCounter = 5 Or GetSimulationStatus() = MCH_SIM_ST.UI_PAUSE Or GetSimulationStatus() = MCH_SIM_ST.UI_STOP Then
ShowCncData()
nShowDataCounter = 0
ElseIf nShowDataCounter > 5 Then
nShowDataCounter = 0
Else
nShowDataCounter += 1
End If
Else
' Per evitare di ciclare rapidissimamente e consumare inutilmente CPU
System.Threading.Thread.Sleep(4)
End If
' Costringo ad aggiornare UI
UpdateUI()
End While
SetSimExecuting(False)
IniFile.m_bSimulExecuting = False
Map.refTopCommandBarVM.DrawIsEnabled = True
Map.refOperationsListExpanderVM.OpersListViewIsEnabled = True
Map.refOperationParametersExpanderVM.OperParamsViewIsEnabled = True
Map.refMachGroupPanelVM.SetMachGroupState(True) ' Map.refMachGroupPanelVM.MachGroupPanelIsEnabled = True
Map.refEstimationsExpanderVM.NotifyPropertyChanged("Estimation_IsEnabled")
If IniFile.m_bSimulEndExitApp Then
refMainWindowVM.CloseApplication( Nothing)
End If
End Sub
Public Overrides Sub OnPostSetSimulationStatus(value As MCH_SIM_ST)
If IniFile.m_nUserLevel >= 5 AndAlso (value = MCH_SIM_ST.UI_PAUSE OrElse value = MCH_SIM_ST.UI_STOP) Then
For Index = 0 To MachineAxisList.Count - 1
MachineAxisList(Index).IsReadOnlyAxesValue = False
Next
Else
For Index = 0 To MachineAxisList.Count - 1
MachineAxisList(Index).IsReadOnlyAxesValue = True
Next
End If
EgtSimSetUiStatus(GetStatus())
End Sub
Public Overrides Sub VMillActiveInfoTitle(VMillActive As Boolean)
If VMillActive Then
EgtSetInfo(EgtGetCurrMachGroup(), KEY_MCHGRP_VM, VMillActive)
Else
EgtRemoveInfo(EgtGetCurrMachGroup(), KEY_MCHGRP_VM)
End If
Map.refProjectVM.EmitTitle()
End Sub
Private Function GetCncFileName(bAskSave As Boolean, ByRef sCncFile As String, ByRef sInfo As String) As Boolean
' Recupero e verifico la path del progetto corrente
Dim sCurrFilePath As String = String.Empty
EgtGetCurrFilePath(sCurrFilePath)
If bAskSave Then
If String.IsNullOrEmpty(sCurrFilePath) OrElse EgtGetModified() Then
' Il progetto deve essere salvato prima di poter essere generato. Vuoi farlo ?
If MessageBox.Show(EgtMsg(MSG_SIMULATION + 31), EgtMsg(MSG_SIMULATION + 15), MessageBoxButton.YesNo, MessageBoxImage.Warning) = MessageBoxResult.No Then
' Abbandono
Return False
Else
' Lancio salvataggio
Map.refProjectVM.SaveProject()
' Se non salvato, abbandono
If EgtGetModified() Then Return False
' Aggiorno path
EgtGetCurrFilePath(sCurrFilePath)
End If
End If
End If
sCncFile = ""
#If PLATFORM = "x64" Then
sInfo = "EgtCAM5 64bit ver." & Map.refMainWindowVM.Version() & " - " & sCurrFilePath
#Else
sInfo = "EgtCAM5 ver." & Map.refMainWindowVM.Version() & " - " & sCurrFilePath
#End If
If EgtGetInfo(EgtGetCurrMachGroup(), KEY_MCHGRP_NCNAME, sCncFile) AndAlso Not String.IsNullOrWhiteSpace(sCncFile) Then
sCncFile = Path.GetDirectoryName(sCurrFilePath) & "\" & sCncFile
Else
sCncFile = Path.ChangeExtension(sCurrFilePath, Nothing)
If IniFile.m_bMachiningGroup Then
Dim sMGrpName As String = String.Empty
If EgtGetMachGroupName(EgtGetCurrMachGroup(), sMGrpName) Then
sCncFile &= "_" & sMGrpName & ".cnc"
sInfo &= "-" & sMGrpName
End If
Else
sCncFile &= ".cnc"
End If
End If
Return True
End Function
Friend Sub SimulationExpander_Update_CncData( nFlag As Integer)
If Simulation_IsExpanded Then
ShowCncData()
' Se fermo per Collisione rilevata da script Lua
If nFlag = 11 Then
' Imposto stato Pausa
SetSimulationStatus(MCH_SIM_ST.UI_PAUSE)
StatusMsg = EgtMsg(MSG_SIMULATION + 11) ' PAUSA
' Aggiornamenti per bottone Play/Pause
SetShowPlay(True)
NotifyPropertyChanged("PlayPauseImage")
' Dichiaro di non arrestarsi alla successiva notifica di collisione
m_bStopOnNextCollision = False
End If
End If
End Sub
#End Region ' METHODS
End Class