Imports System.IO
Imports EgtUILib
Namespace EgtCAM5
Public Class SimulationExpanderViewModel
Inherits ViewModelBase
#Region "FIELDS & PROPERTIES"
'EGT PROPERTIES
' Stato di visualizzazione della macchina
Private m_nMachLook As Integer = MCH_LOOK.ALL
' Utensile corrente
Private m_sCurrTool As String = String.Empty
' Stato e comando correnti
Public Enum SIM_ST As Integer
ST_STOP = 1
ST_PLAY = 2
ST_STEP = 3
ST_PAUSE = 4
End Enum
Private m_nStatus As Integer = SIM_ST.ST_STOP
' Stato bottone Play
Private m_bPlay As Boolean = True
' Coefficiente per valore Slider
Private m_SliderX As Double = 1
'GRAPHICAL PROPERTIES
Private m_IsExpanded As Boolean
Public Property IsExpanded As Boolean
Get
Return m_IsExpanded
End Get
Set(value As Boolean)
If value <> m_IsExpanded Then
If value Then
EgtDeselectAll()
Application.Msn.NotifyColleagues(Application.REMOVEMARKFROMLASTOPERATION)
Application.Msn.NotifyColleagues(Application.GETDISTANCE_ISCHECKED, False)
InitializeSimulation()
Else
CloseSimulation()
End If
m_IsExpanded = value
Application.Msn.NotifyColleagues(Application.SIMULATIONEXPANDER_GET_ISEXPANDED, value)
OnPropertyChanged("IsExpanded")
End If
End Set
End Property
Private m_L1Name As String
Public Property L1Name As String
Get
Return m_L1Name
End Get
Set(value As String)
If value <> m_L1Name Then
m_L1Name = value
OnPropertyChanged("L1Name")
End If
End Set
End Property
Private m_L1Value As String
Public Property L1Value As String
Get
Return m_L1Value
End Get
Set(value As String)
If value <> m_L1Value Then
m_L1Value = value
OnPropertyChanged("L1Value")
End If
End Set
End Property
Private m_L2Name As String
Public Property L2Name As String
Get
Return m_L2Name
End Get
Set(value As String)
If value <> m_L2Name Then
m_L2Name = value
OnPropertyChanged("L2Name")
End If
End Set
End Property
Private m_L2Value As String
Public Property L2Value As String
Get
Return m_L2Value
End Get
Set(value As String)
If value <> m_L2Value Then
m_L2Value = value
OnPropertyChanged("L2Value")
End If
End Set
End Property
Private m_L3Name As String
Public Property L3Name As String
Get
Return m_L3Name
End Get
Set(value As String)
If value <> m_L3Name Then
m_L3Name = value
OnPropertyChanged("L3Name")
End If
End Set
End Property
Private m_L3Value As String
Public Property L3Value As String
Get
Return m_L3Value
End Get
Set(value As String)
If value <> m_L3Value Then
m_L3Value = value
OnPropertyChanged("L3Value")
End If
End Set
End Property
Private m_R1Name As String
Public Property R1Name As String
Get
Return m_R1Name
End Get
Set(value As String)
If value <> m_R1Name Then
m_R1Name = value
OnPropertyChanged("R1Name")
End If
End Set
End Property
Private m_R1Value As String
Public Property R1Value As String
Get
Return m_R1Value
End Get
Set(value As String)
If value <> m_R1Value Then
m_R1Value = value
OnPropertyChanged("R1Value")
End If
End Set
End Property
Private m_R2Name As String
Public Property R2Name As String
Get
Return m_R2Name
End Get
Set(value As String)
If value <> m_R2Name Then
m_R2Name = value
OnPropertyChanged("R2Name")
End If
End Set
End Property
Private m_R2Value As String
Public Property R2Value As String
Get
Return m_R2Value
End Get
Set(value As String)
If value <> m_R2Value Then
m_R2Value = value
OnPropertyChanged("R2Value")
End If
End Set
End Property
Private m_GCode As String
Public Property GCode As String
Get
Return m_GCode
End Get
Set(value As String)
If value <> m_GCode Then
m_GCode = value
OnPropertyChanged("GCode")
End If
End Set
End Property
Private m_FValue As String
Public Property FValue As String
Get
Return m_FValue
End Get
Set(value As String)
If value <> m_FValue Then
m_FValue = value
OnPropertyChanged("FValue")
End If
End Set
End Property
Private m_TName As String
Public Property TName As String
Get
Return m_TName
End Get
Set(value As String)
If value <> m_TName Then
m_TName = value
OnPropertyChanged("TName")
End If
End Set
End Property
Private m_SValue As String
Public Property SValue As String
Get
Return m_SValue
End Get
Set(value As String)
If value <> m_SValue Then
m_SValue = value
OnPropertyChanged("SValue")
End If
End Set
End Property
Private m_PlayPauseImage As String
Public ReadOnly Property PlayPauseImage As String
Get
Select Case m_bPlay
Case False
Return "/Resources/OptionPanel/MachiningOptionPanel/SimulationExpander/Pause.png"
Case True
Return "/Resources/OptionPanel/MachiningOptionPanel/SimulationExpander/Play.png"
Case Else
Return ""
End Select
End Get
End Property
Private m_SliderValue As Double
Public Property SliderValue As Double
Get
Return m_SliderValue
End Get
Set(value As Double)
If value <> m_SliderValue Then
m_SliderValue = value
EgtSimSetStep(value * m_SliderX)
OnPropertyChanged("SliderValue")
End If
End Set
End Property
' Definizione comandi
Private m_cmdStep As ICommand
Private m_cmdPlayPause As ICommand
Private m_cmdStop As ICommand
Private m_cmdGenerate As ICommand
#Region "Messages"
Public ReadOnly Property SimulationMsg As String
Get
Return EgtMsg(MSG_SIMULATION + 7)
End Get
End Property
Public ReadOnly Property GenerateMsg As String
Get
Return EgtMsg(MSG_SIMULATION + 30)
End Get
End Property
#End Region
#Region "ToolTip"
Public ReadOnly Property OneStepToolTip As String
Get
Return EgtMsg(MSG_SIMULATION + 8)
End Get
End Property
Public ReadOnly Property PlayPauseToolTip As String
Get
Return EgtMsg(MSG_SIMULATION + 9)
End Get
End Property
Public ReadOnly Property StopHomeToolTip As String
Get
Return EgtMsg(MSG_SIMULATION + 10)
End Get
End Property
#End Region
#End Region
#Region "CONSTRUCTOR"
Sub New()
Application.Msn.Register(Application.CLOSEAPPLICATION, Sub()
If IsExpanded Then
ResetSimulation()
End If
End Sub)
Application.Msn.Register(Application.SIMULATIONEXPANDER_SET_ISEXPANDED, Sub(bValue As Boolean)
IsExpanded = bValue
End Sub)
End Sub
#End Region
#Region "COMMANDS"
#Region "StepCommand"
'''
''' Returns a command that create a new tool.
'''
Public ReadOnly Property StepCommand As ICommand
Get
If m_cmdStep Is Nothing Then
m_cmdStep = New RelayCommand(AddressOf StepCmd)
End If
Return m_cmdStep
End Get
End Property
'''
''' Creata the new tool. This method is invoked by the NewCommand.
'''
Public Sub StepCmd(ByVal param As Object)
'm_CurrProjPage.ClearMessage()
' Se stato stop, devo avviare simulazione
If m_nStatus = SIM_ST.ST_STOP Then
m_nStatus = SIM_ST.ST_STEP
ExecSim()
' Aggiorno bottone
m_bPlay = True
OnPropertyChanged("PlayPauseImage")
'SetPlayPauseBtnToPlay()
' Alrimenti imposto solo il nuovo stato
Else
m_nStatus = SIM_ST.ST_STEP
' Aggiornamenti per bottone Play/Pause
m_bPlay = False
OnPropertyChanged("PlayPauseImage")
'SetPlayPauseBtnToPause()
End If
End Sub
#End Region ' StepCommand
#Region "PlayPauseCommand"
'''
''' Returns a command that create a new tool.
'''
Public ReadOnly Property PlayPauseCommand As ICommand
Get
If m_cmdPlayPause Is Nothing Then
m_cmdPlayPause = New RelayCommand(AddressOf PlayPause)
End If
Return m_cmdPlayPause
End Get
End Property
'''
''' Creata the new tool. This method is invoked by the NewCommand.
'''
Public Sub PlayPause(ByVal param As Object)
'm_CurrProjPage.ClearMessage()
If m_bPlay Then
' Aggiorno bottone
m_bPlay = False
OnPropertyChanged("PlayPauseImage")
' Eseguo
If m_nStatus = SIM_ST.ST_STOP Then
' Lancio simulazione
m_nStatus = SIM_ST.ST_PLAY
ExecSim()
' Aggiorno bottone
m_bPlay = True
OnPropertyChanged("PlayPauseImage")
ElseIf m_nStatus = SIM_ST.ST_PAUSE Then
m_nStatus = SIM_ST.ST_PLAY
End If
Else
' Aggiorno bottone
m_bPlay = True
OnPropertyChanged("PlayPauseImage")
' Se play o step, imposto stato pausa
If m_nStatus = SIM_ST.ST_PLAY Or m_nStatus = SIM_ST.ST_STEP Then
m_nStatus = SIM_ST.ST_PAUSE
End If
End If
End Sub
#End Region ' PlayPauseCommand
#Region "StopCommand"
'''
''' Returns a command that create a new tool.
'''
Public ReadOnly Property StopCommand As ICommand
Get
If m_cmdStop Is Nothing Then
m_cmdStop = New RelayCommand(AddressOf StopCmd)
End If
Return m_cmdStop
End Get
End Property
'''
''' Creata the new tool. This method is invoked by the NewCommand.
'''
Public Sub StopCmd(ByVal param As Object)
'm_CurrProjPage.ClearMessage()
' Se stato già stop, porto in home
If m_nStatus = SIM_ST.ST_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
m_nStatus = SIM_ST.ST_STOP
End Sub
#End Region ' StopCommand
#Region "GenerateCommand"
'''
''' Returns a command that create a new tool.
'''
Public ReadOnly Property GenerateCommand As ICommand
Get
If m_cmdGenerate Is Nothing Then
m_cmdGenerate = New RelayCommand(AddressOf Generate, AddressOf CanGenerate)
End If
Return m_cmdGenerate
End Get
End Property
'''
''' Creata the new tool. This method is invoked by the NewCommand.
'''
Public Sub Generate(ByVal param As Object)
Dim sInfo As String = "EgtCAM5"
Dim sCurrFilePath As String = String.Empty
EgtGetCurrFilePath(sCurrFilePath)
If Not EgtGenerate(Path.ChangeExtension(sCurrFilePath, ".cnc"), sInfo) Then
MessageBox.Show(EgtMsg(MSG_SIMULATION + 6), EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Stop)
End If
End Sub
'''
''' Returns true if the selected treeviewitem is valid for new tool creation.
'''
Private Function CanGenerate(ByVal param As Object) As Boolean
Return True
End Function
#End Region ' GenerateCommand
#End Region
#Region "METHODS"
Private Sub InitializeSimulation()
' Imposto prima fase
EgtSetCurrPhase(1)
' Costringo ad aggiornare UI
UpdateUI()
' Imposto stato corrente
m_nStatus = SIM_ST.ST_STOP
m_bPlay = True
m_SliderX = GetPrivateProfileDouble(S_SIMUL, K_SLIDERX, 1)
Dim SliderVal As Double = GetPrivateProfileDouble(S_SIMUL, K_SLIDERVAL, 10)
SliderValue = SliderVal
' Porto la testa in home
EgtSimStart()
EgtSimHome()
LoadCurrTools()
EgtDraw()
ShowCncData()
End Sub
Private Sub CloseSimulation()
' Mi assicuro di terminare la simulazione
ResetSimulation()
EgtDraw()
End Sub
Private Sub ResetSimulation()
' Termino la simulazione
m_nStatus = SIM_ST.ST_STOP
EgtSimStop()
' Salvo valore dello slider
Dim sVal As String = DoubleToString(SliderValue, 1)
WritePrivateProfileString(S_SIMUL, K_SLIDERVAL, sVal)
' Torno alla prima fase
EgtSetCurrPhase(1, True)
' Ripristino visibilità standard
'EgtSetMachineLook(MCH_LOOK.TAB)
End Sub
Private Sub ExecSim()
EgtSimStart()
LoadCurrTools()
EgtSimSetStep(SliderValue * m_SliderX)
While m_nStatus <> SIM_ST.ST_STOP
' Se simulazione in svolgimento
If m_nStatus = SIM_ST.ST_PLAY Or m_nStatus = SIM_ST.ST_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 = SIM_ST.ST_STEP And nMove = MCH_SIM.END_STEP Then
' Imposto stato Pausa
m_nStatus = SIM_ST.ST_PAUSE
' Aggiornamenti per bottone Play/Pause
m_bPlay = True
OnPropertyChanged("PlayPauseImage")
End If
' Se movimento non riuscito
Else
m_nStatus = SIM_ST.ST_STOP
' Aggiornamenti per bottone Play/Pause
m_bPlay = True
OnPropertyChanged("PlayPauseImage")
Select Case nMove
Case MCH_SIM.END_
'MsgBox(EgtMsg(MSG_SIMULATION + 1)) 'Simulazione completata
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
MessageBox.Show(EgtMsg(MSG_SIMULATION + 4), EgtMsg(MSG_SIMULATION + 5), MessageBoxButton.OK, MessageBoxImage.Stop) 'Errore
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
End Sub
Private Sub ShowCncData()
' Assi
Dim nInd As Integer = 0
ShowAxisNameVal(nInd, L1Name, L1Value)
ShowAxisNameVal(nInd, L2Name, L2Value)
ShowAxisNameVal(nInd, L3Name, L3Value)
ShowAxisNameVal(nInd, R1Name, R1Value)
ShowAxisNameVal(nInd, R2Name, R2Value)
' Tipo di movimento e feed
ShowMoveTypeFeed()
' Nome utensile e speed
ShowToolNameSpeed()
End Sub
Private Function ShowAxisNameVal(ByRef nInd As Integer, ByRef sName As String, ByRef sVal As String) As Boolean
Dim sInfo As String = String.Empty
Dim dVal As Double = 0
If EgtSimGetAxisInfoPos(nInd, sInfo, dVal) Then
If sInfo <> "**" Then
sName = sInfo
sVal = If(nInd < 3, LenToString(dVal, -3), DoubleToString(dVal, -3))
nInd += 1
Return True
Else
nInd += 1
Return ShowAxisNameVal(nInd, sName, sVal)
End If
Else
sName = 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
GCode = "G" & nG.ToString()
FValue = "F" & LenToString(dFeed, 0)
Else
GCode = "G" & nG.ToString()
FValue = ""
End If
Return True
Else
GCode = ""
FValue = ""
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
TName = sTool
SValue = "S" & DoubleToString(dSpeed, 0)
Return True
Else
TName = ""
SValue = ""
Return False
End If
End Function
Private Function LoadCurrTools() As Boolean
'' Imposto la lama corrente
'Dim sSaw As String = m_MainWindow.m_CurrentMachine.sCurrSaw
'If Not EgtLoadTool("H1", 1, sSaw) Then
' Return False
'End If
'' 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
'End If
Return True
End Function
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
#End Region
End Class
End Namespace