Imports System.Collections.ObjectModel
Imports System.Threading
Imports EgtBEAMWALL.Core
Imports EgtUILib
Imports EgtWPFLib5
Public Class OptimizePanelVM
Inherits VMBase
#Region "FIELDS & PROPERTIES"
Friend m_bNestingRunning As Boolean = False
Friend m_StopNesting As Boolean = False
Public Enum PartType As Integer
MATERIAL = 0
ALL = 1
End Enum
Friend Enum OriginType As Integer
STANDARD = 0
FROM_BTL = 1
End Enum
Private m_PartTypeList As New List(Of IdNameStruct)({New IdNameStruct(PartType.MATERIAL, "Materiale"),
New IdNameStruct(PartType.ALL, "Tutti")})
Public ReadOnly Property PartTypeList As List(Of IdNameStruct)
Get
Return m_PartTypeList
End Get
End Property
Private m_SelPartType As IdNameStruct
Public Property SelPartType As IdNameStruct
Get
Return m_SelPartType
End Get
Set(value As IdNameStruct)
m_SelPartType = value
End Set
End Property
Private m_OriginTypeList As New List(Of IdNameStruct)({New IdNameStruct(OriginType.STANDARD, "Standard"),
New IdNameStruct(OriginType.FROM_BTL, "Da BTL")})
Public ReadOnly Property OriginTypeList As List(Of IdNameStruct)
Get
Return m_OriginTypeList
End Get
End Property
Private m_SelOriginType As IdNameStruct
Public Property SelOriginType As IdNameStruct
Get
Return m_SelOriginType
End Get
Set(value As IdNameStruct)
m_SelOriginType = value
End Set
End Property
Private m_bLDIntersOther As Boolean = False
Public Property bLDIntersOther As Boolean
Get
Return m_bLDIntersOther
End Get
Set(value As Boolean)
m_bLDIntersOther = value
WriteMainPrivateProfileString(S_NEST, K_LDINTERSOTHER, If(m_bLDIntersOther, 1, 0))
End Set
End Property
Public ReadOnly Property NestingOption_Visibility As Visibility
Get
If Map.refMainMenuVM.SelPage = Pages.MACHINING Then
If CurrentMachine.nType = MachineType.WALL OrElse CurrentMachine.nType = MachineType.BOTH Then
If CurrentMachine.dHorDrillDiam > 0 And Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO) Then
Return Visibility.Visible
End If
End If
End If
Return Visibility.Collapsed
End Get
End Property
Private m_nMinScore As Integer
Public Property dMinScore As Double
Get
Return m_nMinScore
End Get
Set(value As Double)
m_nMinScore = Math.Floor(Math.Min(100, Math.Max(value, 0)))
WriteMainPrivateProfileString(S_NEST, K_MINSCORE, m_nMinScore)
End Set
End Property
Private m_Optimize_IsEnabled As Boolean = True
Public ReadOnly Property Optimize_IsEnabled As Boolean
Get
Return m_Optimize_IsEnabled
End Get
End Property
Private m_CalcRotFlip_IsEnabled As Boolean = True
Public ReadOnly Property CalcRotFlip_IsEnabled As Boolean
Get
Return m_CalcRotFlip_IsEnabled
End Get
End Property
Public ReadOnly Property CalcRotFlip_Visibility As Visibility
Get
Return If(Map.refMainMenuVM.SelPage = Pages.VIEW AndAlso Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO), Visibility.Visible, Visibility.Collapsed)
End Get
End Property
Public ReadOnly Property Optimize_Visibility As Visibility
Get
Return If(Map.refMainMenuVM.SelPage = Pages.MACHINING AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso
(Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM OrElse
(Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL AndAlso Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO))), Visibility.Visible, Visibility.Collapsed)
End Get
End Property
Public ReadOnly Property ViewPage_Visibility As Visibility
Get
Return If(Map.refMainMenuVM.SelPage = Pages.VIEW, Visibility.Visible, Visibility.Collapsed)
End Get
End Property
Public ReadOnly Property MachiningPage_Visibility As Visibility
Get
Return If(Map.refMainMenuVM.SelPage = Pages.MACHINING, Visibility.Visible, Visibility.Collapsed)
End Get
End Property
#Region "Messages"
Public ReadOnly Property LongDrillArea_Msg As String
Get
Return EgtMsg(61889)
End Get
End Property
Public ReadOnly Property MinScore_Msg As String
Get
Return EgtMsg(61890)
End Get
End Property
Public ReadOnly Property Optimize_Msg As String
Get
Return EgtMsg(61833)
End Get
End Property
Public ReadOnly Property Warehouse_ToolTip As String
Get
Return EgtMsg(61920)
End Get
End Property
Public ReadOnly Property CalcRotFlip_ToolTip As String
Get
Return EgtMsg(61932)
End Get
End Property
Public ReadOnly Property UnlockFlip_ToolTip As String
Get
Return EgtMsg(61933)
End Get
End Property
Public ReadOnly Property UnlockRot_ToolTip As String
Get
Return EgtMsg(61934)
End Get
End Property
#End Region ' Messages
' Definizione comandi
Private m_cmdOptimize As ICommand
Private m_cmdCalcRotFlip As ICommand
Private m_cmdUnlockRot As ICommand
Private m_cmdUnlockFlip As ICommand
Private m_cmdWarehouse As ICommand
#End Region ' FIELDS & PROPERTIES
#Region "CONSTRUCTOR"
Sub New()
' aggiungo riferimento a Map
Map.SetRefOptimizePanelVM(Me)
m_SelPartType = PartTypeList(0)
m_SelOriginType = OriginTypeList(0)
m_bLDIntersOther = False
NotifyPropertyChanged(NameOf(SelPartType))
End Sub
#End Region ' CONSTRUCTOR
#Region "METHODS"
Friend Sub SetOptimizePanelIsEnabled(bIsEnabled As Boolean)
' se pareti e senza opzione nesting, lascio disabilitato
If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL AndAlso Not Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO) Then
m_Optimize_IsEnabled = False
m_CalcRotFlip_IsEnabled = False
Else
m_Optimize_IsEnabled = bIsEnabled
m_CalcRotFlip_IsEnabled = bIsEnabled
End If
NotifyPropertyChanged(NameOf(Optimize_IsEnabled))
NotifyPropertyChanged(NameOf(CalcRotFlip_IsEnabled))
End Sub
Friend Function ProcessEvents(ByVal nProg As Integer, ByVal nPause As Integer) As Integer
If nProg > 0 And nProg <= 100 Then
NestingRunningWndVM.m_CurrState = SectionProgress.NestStates.NEST
NestingRunningWndVM.m_CurrTime = nProg
ElseIf nProg > 100 And nProg <= 200 Then
NestingRunningWndVM.m_CurrState = SectionProgress.NestStates.ADDPART
NestingRunningWndVM.m_CurrTime = nProg - 100
ElseIf nProg > 200 And nProg <= 300 Then
NestingRunningWndVM.m_CurrState = SectionProgress.NestStates.CALCRAWPART
NestingRunningWndVM.m_CurrTime = nProg - 200
End If
' Costringo ad aggiornare
UpdateUI()
' Eventuale attesa
Thread.Sleep(nPause)
' Ritorno eventuale stop
If m_StopNesting Then
m_StopNesting = False
Return 1
Else
Return 0
End If
End Function
Private Sub StartCalcRotFlip(BTLPart As BTLPartVM)
' ricalcolo rotflip
m_bNestingRunning = True
' se vista tutti i pezzi
Dim bShowBuilding As Boolean = False
If Map.refShowBeamPanelVM.bShowAll Then
' verifico se assemblato e lo annullo per salvataggio
bShowBuilding = Map.refShowBeamPanelVM.ShowBuilding_IsChecked
If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False)
End If
Dim NestingRunningWndVM As New NestingRunningWndVM(m_SelPartType.Id, BTLPart)
Dim NestingRunningWnd As New NestingRunningWndV(Application.Current.MainWindow, NestingRunningWndVM)
NestingRunningWnd.ShowDialog()
' se assemblato lo ripristino
If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False)
EgtDraw()
m_bNestingRunning = False
End Sub
#End Region ' METHODS
#Region "COMMANDS"
#Region "CalcRotFlip"
'''
''' Returns a command that do Open.
'''
Public ReadOnly Property CalcRotFlip_Command As ICommand
Get
If m_cmdCalcRotFlip Is Nothing Then
m_cmdCalcRotFlip = New Command(AddressOf CalcRotFlip)
End If
Return m_cmdCalcRotFlip
End Get
End Property
'''
''' Execute the Open. This method is invoked by the OpenCommand.
'''
Friend Sub CalcRotFlip()
If IsNothing(Map.refProjectVM.BTLStructureVM) OrElse IsNothing(Map.refProjectVM.BTLStructureVM.BTLPartVMList) OrElse Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count = 0 Then Return
' lancio calcolo RotFlip
StartCalcRotFlip(Nothing)
End Sub
#End Region ' CalcRotFlip
#Region "UnlockRot"
'''
''' Returns a command that do Open.
'''
Public ReadOnly Property UnlockRot_Command As ICommand
Get
If m_cmdUnlockRot Is Nothing Then
m_cmdUnlockRot = New Command(AddressOf UnlockRot)
End If
Return m_cmdUnlockRot
End Get
End Property
'''
''' Execute the Open. This method is invoked by the OpenCommand.
'''
Friend Sub UnlockRot()
If IsNothing(Map.refProjectVM.BTLStructureVM) OrElse IsNothing(Map.refProjectVM.BTLStructureVM.BTLPartVMList) OrElse Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count = 0 Then Return
If (Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift Then
For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList
If IsNothing(BTLPart) Then Continue For
If BTLPart.bLockRotation Then
BTLPart.bLockRotation = False
End If
Next
' lancio calcolo RotFlip
StartCalcRotFlip(Nothing)
Else
Dim SelBTLPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart
If IsNothing(SelBTLPart) Then Return
If SelBTLPart.bLockRotation Then
SelBTLPart.bLockRotation = False
' lancio calcolo RotFlip
StartCalcRotFlip(SelBTLPart)
End If
End If
End Sub
#End Region ' UnlockRot
#Region "UnlockFlip"
'''
''' Returns a command that do Open.
'''
Public ReadOnly Property UnlockFlip_Command As ICommand
Get
If m_cmdUnlockFlip Is Nothing Then
m_cmdUnlockFlip = New Command(AddressOf UnlockFlip)
End If
Return m_cmdUnlockFlip
End Get
End Property
'''
''' Execute the Open. This method is invoked by the OpenCommand.
'''
Friend Sub UnlockFlip()
If IsNothing(Map.refProjectVM.BTLStructureVM) OrElse IsNothing(Map.refProjectVM.BTLStructureVM.BTLPartVMList) OrElse Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count = 0 Then Return
If (Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift Then
For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList
If IsNothing(BTLPart) Then Continue For
BTLPart.bLockInversion = False
Next
' lancio calcolo RotFlip
StartCalcRotFlip(Nothing)
Else
Dim SelBTLPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart
If IsNothing(SelBTLPart) Then Return
SelBTLPart.bLockInversion = False
' lancio calcolo RotFlip
StartCalcRotFlip(SelBTLPart)
End If
End Sub
#End Region ' UnlockFlip
#Region "Optimize"
'''
''' Returns a command that do Open.
'''
Public ReadOnly Property Optimize_Command As ICommand
Get
If m_cmdOptimize Is Nothing Then
m_cmdOptimize = New Command(AddressOf Optimize)
End If
Return m_cmdOptimize
End Get
End Property
'''
''' Execute the Open. This method is invoked by the OpenCommand.
'''
Friend Sub Optimize()
If IsNothing(m_SelPartType) OrElse IsNothing(m_SelOriginType) Then Return
If IsNothing(Map.refProjectVM.BTLStructureVM) OrElse IsNothing(Map.refProjectVM.BTLStructureVM.BTLPartVMList) OrElse Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count = 0 Then Return
' se nessun grezzo, rendo tutti i pezzi visibili
If Map.refProjectVM.MachGroupPanelVM.MachGroupVMList.Count = 0 Then
Map.refProjectVM.BTLStructureVM.ShowAll(False)
End If
' apro finestra di attesa nesting
m_bNestingRunning = True
Dim NestingRunningWndVM As New NestingRunningWndVM(NestingRunningWndVM.OperationTypes.NESTING, m_SelPartType.Id, m_bLDIntersOther, m_nMinScore)
Dim NestingRunningWnd As New NestingRunningWndV(Application.Current.MainWindow, NestingRunningWndVM)
NestingRunningWnd.ShowDialog()
m_bNestingRunning = False
' se nessun grezzo, rimetto tutti i pezzi invisibili
If Map.refProjectVM.MachGroupPanelVM.MachGroupVMList.Count = 0 Then
Map.refProjectVM.BTLStructureVM.HideAll(True)
End If
' mostro risultati
Dim sResult As String = ""
For Each Section In NestingRunningWndVM.SectionProgressList
If Section.SectionPartList.Count > 0 AndAlso Section.SParamList.Count = 0 Then
sResult &= Section.Section.sSectionXMaterial & ": no raw part found in the warehouse!" & Environment.NewLine
End If
For Each Part In Section.SectionPartList
If Part.nINPROD <> Part.nCNT + Part.nADDED Then
sResult &= Section.Section.sSectionXMaterial & " - " & Part.nPDN & ": partially nested!" & "(" & Part.nINPROD & "/" & Part.nCNT + Part.nADDED & ")" & Environment.NewLine
End If
Next
Next
If Not String.IsNullOrWhiteSpace(sResult) Then
MessageBox.Show(Application.Current.MainWindow, sResult, "", MessageBoxButton.OK, MessageBoxImage.Warning)
End If
End Sub
#End Region ' Optimize
#Region "Warehouse"
'''
''' Returns a command that do Open.
'''
Public ReadOnly Property Warehouse_Command As ICommand
Get
If m_cmdWarehouse Is Nothing Then
m_cmdWarehouse = New Command(AddressOf Warehouse)
End If
Return m_cmdWarehouse
End Get
End Property
'''
''' Execute the Open. This method is invoked by the OpenCommand.
'''
Friend Sub Warehouse()
If Not IsNothing(Map.refProjectVM.BTLStructureVM) Then 'If Not IsNothing(Map.refProdManagerVM.CurrProd) Then
Dim WarehouseWnd As New WarehouseWndV(Application.Current.MainWindow, New WarehouseWndVM())
WarehouseWnd.ShowDialog()
End If
End Sub
#End Region ' Warehouse
#End Region ' COMMANDS
End Class