Files
egtbeamwall/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/PartVM.vb
T
Emmanuele Sassi ee558cecd6 - Migliorie Calc pezzi
- Correzione flip e rot dei duplo
- Cambiata gestione ricalcolo in supervisore
- Aggiunti controlli su comunicazione tra programmi
- Gestione apertura progetto con s/blocco duplo
- Gestione errore ricalcolo in supervisore
- Aggiunti controlli su cicli di comunicazione tra programmi
2022-02-03 21:49:05 +01:00

592 lines
23 KiB
VB.net

Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Imports System.ComponentModel
Imports System.IO
Imports EgtBEAMWALL.Core
Imports EgtBEAMWALL.DataLayer.DatabaseModels
Imports EgtUILib
Imports EgtWPFLib5
Public Class PartVM
Inherits Core.PartVM
#Region "FIELDS & PROPERTIES"
#Region "General"
Public ReadOnly Property dVolume As Double
Get
Return dVolume
End Get
End Property
#End Region ' General
#Region "Beam"
Public Overrides Property sOffset As String
Get
Return LenToString(m_PartM.dOffset, 3)
End Get
Set(value As String)
Dim dValue As Double
If StringToLen(value, dValue) Then
Dim dOldValue As Double = m_PartM.dOffset
m_PartM.dOffset = dValue
' se prima trave della barra sostituisco valore anche a startoffset
Dim BeamMachGroup As MyMachGroupVM = DirectCast(ParentMachGroupVM, MyMachGroupVM)
If ParentMachGroupVM.PartVMList(0) Is Me Then
BeamMachGroup.dStartCut = dValue
End If
If Not BeamMachGroup.ReDrawBeamMachgroup() Then
' rispristino vecchio valore
m_PartM.dOffset = dOldValue
BeamMachGroup.dStartCut = dOldValue
BeamMachGroup.ReDrawBeamMachgroup()
End If
' resetto validazione del pezzo
ResetCalcPart()
Else
NotifyPropertyChanged(NameOf(sOffset))
End If
End Set
End Property
#End Region ' Beam
#Region "Wall"
Public Overrides Property sPOSX As String
Get
Select Case Map.refProjectVM.BTLStructureVM.nPROJTYPE
Case BWType.WALL
' se parete, valuto angolo di posizionamento
Select Case CurrentMachine.NestingCorner
Case MCH_CR.TL, MCH_CR.BL
Return LenToString(m_PartM.dPOSX, 3)
Case Else ' MCH_CR.TR, MCH_CR.BR
Return LenToString(m_ParentMachGroupVM.dL - dL - m_PartM.dPOSX, 3)
End Select
Case Else
Return LenToString(m_PartM.dPOSX, 3)
End Select
End Get
Set(value As String)
Dim dValue As Double
If StringToLen(value, dValue) Then
Dim dOldValue As Double = m_PartM.dPOSX
Dim dNewValue As Double = dValue
Select Case Map.refProjectVM.BTLStructureVM.nPROJTYPE
Case BWType.WALL
' se parete, valuto angolo di posizionamento
Select Case CurrentMachine.NestingCorner
Case MCH_CR.TL, MCH_CR.BL
dNewValue = dValue
Case Else ' MCH_CR.TR, MCH_CR.BR
dNewValue = m_ParentMachGroupVM.dL - dL - dValue
End Select
Case Else
m_PartM.dPOSX = dValue
End Select
If EgtMovePartInRawPart(nPartId, New Vector3d(dNewValue - dOldValue, 0, 0)) Then
EgtSetInfo(nPartId, MGR_PRT_POSX, dValue)
NotifyPropertyChanged(NameOf(sPOSX))
' resetto validazione del pezzo
ResetCalcPart()
Else
' ripristino vecchio valore
m_PartM.dPOSX = dOldValue
End If
EgtDraw()
Else
NotifyPropertyChanged(NameOf(sPOSX))
End If
End Set
End Property
Public Overrides Property sPOSY As String
Get
Select Case Map.refProjectVM.BTLStructureVM.nPROJTYPE
Case BWType.WALL
' valuto angolo di posizionamento
Select Case CurrentMachine.NestingCorner
Case MCH_CR.TL, MCH_CR.TR
Return LenToString(m_ParentMachGroupVM.dW - dW - m_PartM.dPOSY, 3)
Case Else ' MCH_CR.BL, MCH_CR.BR
Return LenToString(m_PartM.dPOSY, 3)
End Select
Case Else
Return LenToString(m_PartM.dPOSY, 3)
End Select
End Get
Set(value As String)
Dim dValue As Double
If StringToLen(value, dValue) Then
Dim dOldValue As Double = m_PartM.dPOSY
Dim dNewValue As Double = dValue
' valuto angolo di posizionamento
Select Case Map.refProjectVM.BTLStructureVM.nPROJTYPE
Case BWType.WALL
Select Case CurrentMachine.NestingCorner
Case MCH_CR.TL, MCH_CR.TR
dNewValue = m_ParentMachGroupVM.dW - dW - dValue
Case MCH_CR.BL, MCH_CR.BR
dNewValue = dValue
End Select
Case Else
m_PartM.dPOSY = dValue
End Select
If EgtMovePartInRawPart(nPartId, New Vector3d(0, dNewValue - dOldValue, 0)) Then
EgtSetInfo(nPartId, MGR_PRT_POSY, dValue)
NotifyPropertyChanged(NameOf(sPOSY))
' resetto validazione del pezzo
ResetCalcPart()
Else
' ripristino vecchio valore
m_PartM.dPOSY = dOldValue
End If
EgtDraw()
Else
NotifyPropertyChanged(NameOf(sPOSY))
End If
End Set
End Property
Public Property bFLIP As Boolean
Get
Return m_PartM.nFLIP <> 0
End Get
Set(value As Boolean)
If Map.refProjectVM.bCalcRunning Then Return
' se MachGroup gia' mandato in produzione, esco
If m_ParentMachGroupVM.nProduction_State >= ItemState.Assigned Then Return
If (value And m_PartM.nFLIP = 0) OrElse (Not value And m_PartM.nFLIP <> 0) Then
' salvo posizione
Dim dTempPosX As Double = m_PartM.dPOSX
Dim dTempPosY As Double = m_PartM.dPOSY
' tolgo il pezzo dal grezzo
EgtRemovePartFromRawPart(nPartId)
' recupero layer del box
Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nPartId, "Box")
' recupero box del layer box
Dim b3Box As New BBox3d
EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box)
If EgtRotate(nPartId, b3Box.Center, Vector3d.X_AX, 180, GDB_RT.GLOB) Then
m_PartM.nFLIP = If(value, 180, 0)
EgtSetInfo(nPartId, MGR_PRT_FLIP, If(value, 180, 0))
Else
NotifyPropertyChanged(NameOf(bFLIP))
End If
' recupero box del pezzo
Dim b3Part As New BBox3d
EgtGetBBoxGlob(nPartId, GDB_BB.STANDARD, b3Part)
' calcolo distanza tra i box
Dim vtDeltaBox As Vector3d = b3Box.Min - b3Part.Min
' reinserisco il pezzo nel grezzo
EgtAddPartToRawPart(nPartId, New Point3d(dTempPosX - vtDeltaBox.x, dTempPosY - vtDeltaBox.y, 0), ParentMachGroupVM.MyMachGroupM.nRawPartId)
' lo riseleziono
EgtSelectObj(nPartId)
' resetto validazione del pezzo
ResetCalcPart()
EgtDraw()
End If
End Set
End Property
#End Region ' Wall
' Definizione comandi
Private m_cmdBackRotation As ICommand
Private m_cmdForwardRotation As ICommand
#End Region ' FIELDS & PROPERTIES
#Region "CONSTRUCTOR"
Sub New(PartM As PartM, ParentMachGroupVM As MyMachGroupVM)
MyBase.New(PartM, ParentMachGroupVM)
' aggiorno stato calcolo
CalcGlobalUpdate()
' aggiorno stato di produzione
ReadProductionData()
End Sub
#End Region ' CONSTRUCTOR
#Region "METHODS"
#Region "Part"
Friend Sub ResetOffset()
m_PartM.dOffset = WarehouseHelper.GetOffset(nType)
NotifyPropertyChanged(NameOf(sOffset))
End Sub
' Manage the MainWindow_Unloaded event. This method is invoked by the cmdMainWindow_Unloaded.
Public Overrides Sub DeletePart()
' elimino pezzo copia
EgtRemovePartFromRawPart(Me.nPartId)
' Recupero Id BTLPart originale
Dim BTLPart As BTLPartVM = BTLPartVM.RetrieveBTLPartFromPart(nPartId)
EgtErase(Me.nPartId)
' rimuovo dalla lista pezzi
Dim Index As Integer = ParentMachGroupVM.PartVMList.IndexOf(ParentMachGroupVM.PartVMList.FirstOrDefault(Function(x) x.nPartId = nPartId))
If Index = 0 Then
If ParentMachGroupVM.PartVMList.Count > 1 Then
ParentMachGroupVM.SelPart = ParentMachGroupVM.PartVMList(0)
Else
ParentMachGroupVM.SelPart = Nothing
End If
ElseIf Index = ParentMachGroupVM.PartVMList.Count - 1 Then
If ParentMachGroupVM.PartVMList.Count > 1 Then
ParentMachGroupVM.SelPart = ParentMachGroupVM.PartVMList(ParentMachGroupVM.PartVMList.Count - 2)
Else
ParentMachGroupVM.SelPart = Nothing
End If
Else
ParentMachGroupVM.SelPart = ParentMachGroupVM.PartVMList(Index - 1)
End If
ParentMachGroupVM.PartVMList.Remove(Me)
If nType = MachineType.BEAM Then
Dim BeamParentMachGroup As MyMachGroupVM = DirectCast(ParentMachGroupVM, MyMachGroupVM)
If Not IsNothing(BeamParentMachGroup) Then BeamParentMachGroup.ReDrawBeamMachgroup()
End If
' aggiorno contatore pezzi usati in Prod
If Not IsNothing(BTLPart) Then BTLPart.RefreshPartInProd()
EgtDraw()
End Sub
Private Sub Rotate(IsPositive As Boolean)
' salvo posizione
Dim dTempPosX As Double = m_PartM.dPOSX
Dim dTempPosY As Double = m_PartM.dPOSY
' tolgo il pezzo dal grezzo
EgtRemovePartFromRawPart(nPartId)
' recupero layer del box
Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nPartId, "Box")
' recupero box del layer box
Dim b3Box As New BBox3d
EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box)
' se invertito lo reinverto
Dim bFliped As Boolean = bFLIP
If bFliped Then EgtRotate(nPartId, b3Box.Center, Vector3d.X_AX, 180, GDB_RT.GLOB)
Dim dAng As Double = If(IsPositive, 90, -90)
' eseguo rotazione
Dim bOk As Boolean = EgtRotate(nPartId, b3Box.Center, -Vector3d.Z_AX, dAng, GDB_RT.GLOB)
If bOk Then
Dim TempRot = m_PartM.dROT
TempRot += dAng
If TempRot >= 360 Then
TempRot -= 360
ElseIf TempRot < 0 Then
TempRot += 360
End If
m_PartM.dROT = TempRot
EgtSetInfo(nPartId, MGR_PRT_ROT, m_PartM.dROT)
End If
' ripristino eventuale inversione
If bFliped Then EgtRotate(nPartId, b3Box.Center, Vector3d.X_AX, 180, GDB_RT.GLOB)
' recupero box del pezzo
Dim b3Part As New BBox3d
EgtGetBBoxGlob(nPartId, GDB_BB.STANDARD, b3Part)
'aggiorno box del box con rotazione
EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box)
' calcolo distanza tra i box
Dim vtDeltaBox As Vector3d = b3Box.Min - b3Part.Min ' Vector3d.NULL
' calcolo posizione rispetto al riferimento
Select Case Map.refProjectVM.BTLStructureVM.nPROJTYPE
Case BWType.WALL
' se parete, valuto angolo di posizionamento
Select Case CurrentMachine.NestingCorner
Case MCH_CR.TL
'vtDeltaBox = New Vector3d(b3Box.Min.x - b3Part.Min.x, b3Box.Max.y - b3Part.Max.y, 0)
dTempPosY = dTempPosY - dW + dL
Case MCH_CR.BL
'vtDeltaBox = b3Box.Min - b3Part.Min
' non cambio posizioni
Case MCH_CR.TR
'vtDeltaBox = b3Box.Max - b3Part.Max
dTempPosX = dTempPosX - dL
dTempPosY = dTempPosY + dW - dL
Case MCH_CR.BR
'vtDeltaBox = New Vector3d(b3Box.Max.x - b3Part.Max.x, b3Box.Min.y - b3Part.Min.y, 0)
dTempPosX = dTempPosX - dL
End Select
Case Else
' non cambio nulla
End Select
' reinserisco il pezzo nel grezzo
EgtAddPartToRawPart(nPartId, New Point3d(dTempPosX - vtDeltaBox.x, dTempPosY - vtDeltaBox.y, 0), ParentMachGroupVM.MyMachGroupM.nRawPartId)
' lo riseleziono
EgtSelectObj(nPartId)
' resetto validazione del pezzo
ResetCalcPart()
NotifyPropertyChanged(NameOf(sROT))
End Sub
Friend Sub SelectBTLPart()
' eseguo la selezione nella lista pezzi
Dim nBTLPartId As Integer = MyMachGroupPanelM.DuploGetOriginal(nPartId)
If Not IsNothing(nBTLPartId) Then
Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nBTLPartId))
End If
End Sub
Private Sub ReadProductionData()
If IsNothing(Map.refProdManagerVM.CurrProd) OrElse IsNothing(Map.refProdManagerVM.CurrProd.nProdId) Then Return
Dim PartModel As PartModel = DbControllers.m_PartController.FindByPartId(Map.refProdManagerVM.CurrProd.nProdId, nPartId)
If Not IsNothing(PartModel) Then
PartM.SetProductionState(PartModel.State)
PartM.dtStartTime = PartModel.DtStart
PartM.dtEndTime = PartModel.DtEnd
' verifico se bloccare o sbloccare duplo
Dim bLocked As Boolean = True
EgtDuploGetLocked(nPartId, bLocked)
If PartModel.State <= ItemState.ND And bLocked Then
' recupero se Duplo da aggiornare
Dim bDuploToUpdate As Boolean = False
EgtGetInfo(nPartId, GDB_SI_DUPTOUPDATE, bDuploToUpdate)
' verifico tipo di progetto
Dim nBtlInfoId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO)
Dim nBWType As Integer = 0
EgtGetInfo(nBtlInfoId, BTL_GEN_PROJTYPE, nBWType)
Dim DuploRot As Integer = 0
Dim DuploFlip As Integer = 0
Dim QParams As New Dictionary(Of String, Dictionary(Of String, String))
' se da aggiornare, leggo info del duplo che verrebbero perse
If bDuploToUpdate Then
' recupero ROT (gradi) e FLIP (gradi) per non perderli
EgtGetInfo(nPartId, MGR_PRT_ROT, DuploRot)
EgtGetInfo(nPartId, MGR_PRT_FLIP, DuploFlip)
If DuploFlip <> 0 Then DuploFlip = 180
If nBWType = BWType.WALL Then
' ciclo sugli outline
Dim nOutlineLayer As Integer = EgtGetFirstNameInGroup(nPartId, OUTLINE)
If nOutlineLayer <> GDB_ID.NULL Then
Dim nGlobPRId As Integer = 1
Dim nOutlineId As Integer = EgtGetFirstInGroup(nOutlineLayer)
While nOutlineId <> GDB_ID.NULL
' verifico che sia outline
Dim nPRC As Integer
If EgtGetInfo(nOutlineId, MGR_FTR_PRC, nPRC) Then
Dim nPRId As Integer = 0
If Not EgtGetInfo(nOutlineId, MGR_FTR_PRID, nPRId) Then
EgtSetInfo(nOutlineId, MGR_FTR_PRID, nGlobPRId)
nPRId = nGlobPRId
nGlobPRId += 1
End If
Dim sKey As String = nPRId & "." & nPRC
QParams.Add(sKey, New Dictionary(Of String, String))
For QIndex = 1 To 10
Dim QKey As String = "Q" & QIndex.ToString("D2")
Dim QValue As Integer = 0
If EgtGetInfo(nOutlineId, QKey, QValue) Then
QParams(sKey).Add(QKey, QValue)
End If
Next
End If
nOutlineId = EgtGetNext(nOutlineId)
End While
End If
' ciclo sulle feature
Dim nFeatureLayer As Integer = EgtGetFirstNameInGroup(nPartId, PROCESSINGS)
If nFeatureLayer <> GDB_ID.NULL Then
Dim nFeatureId As Integer = EgtGetFirstInGroup(nFeatureLayer)
While nFeatureId <> GDB_ID.NULL
' verifico che sia feature
Dim nPRC As Integer
If EgtGetInfo(nFeatureId, MGR_FTR_PRC, nPRC) Then
Dim nPRId As Integer = 0
EgtGetInfo(nFeatureId, MGR_FTR_PRID, nPRId)
Dim sKey As String = nPRId & "." & nPRC
QParams.Add(sKey, New Dictionary(Of String, String))
For QIndex = 1 To 10
Dim QKey As String = "Q" & QIndex.ToString("D2")
Dim QValue As Integer = 0
If EgtGetInfo(nFeatureId, QKey, QValue) Then
QParams(sKey).Add(QKey, QValue)
End If
Next
End If
nFeatureId = EgtGetNext(nFeatureId)
End While
End If
End If
End If
' sblocco Duplo
EgtDuploResetLocked(nPartId)
' se da aggiornare, ripristino info del duplo che verrebbero perse
If bDuploToUpdate Then
' ripristino i valori di ROT e FLIP
EgtSetInfo(nPartId, MGR_PRT_ROT, DuploRot)
EgtSetInfo(nPartId, MGR_PRT_FLIP, DuploFlip)
If nBWType = BWType.WALL Then
' ciclo sugli outline
Dim nOutlineLayer As Integer = EgtGetFirstNameInGroup(nPartId, OUTLINE)
If nOutlineLayer <> GDB_ID.NULL Then
Dim nOutlineId As Integer = EgtGetFirstInGroup(nOutlineLayer)
While nOutlineId <> GDB_ID.NULL
' verifico che sia feature
Dim nPRC As Integer
If EgtGetInfo(nOutlineId, MGR_FTR_PRC, nPRC) Then
Dim nPRId As Integer = 0
EgtGetInfo(nOutlineId, MGR_FTR_PRID, nPRId)
Dim sKey As String = nPRId & "." & nPRC
' ripristino parametri Q
If QParams.ContainsKey(sKey) Then
For Each QPar In QParams(sKey)
EgtSetInfo(nOutlineId, QPar.Key, QPar.Value)
Next
End If
End If
nOutlineId = EgtGetNext(nOutlineId)
End While
End If
' ciclo sulle feature
Dim nFeatureLayer As Integer = EgtGetFirstNameInGroup(nPartId, PROCESSINGS)
If nFeatureLayer <> GDB_ID.NULL Then
Dim nFeatureId As Integer = EgtGetFirstInGroup(nFeatureLayer)
While nFeatureId <> GDB_ID.NULL
' verifico che sia feature
Dim nPRC As Integer
If EgtGetInfo(nFeatureId, MGR_FTR_PRC, nPRC) Then
Dim nPRId As Integer = 0
EgtGetInfo(nFeatureId, MGR_FTR_PRID, nPRId)
Dim sKey As String = nPRId & "." & nPRC
' ripristino parametri Q
If QParams.ContainsKey(sKey) Then
For Each QPar In QParams(sKey)
EgtSetInfo(nFeatureId, QPar.Key, QPar.Value)
Next
End If
End If
nFeatureId = EgtGetNext(nFeatureId)
End While
End If
End If
End If
nProduction_State = ItemState.ND
NotifyPropertyChanged(NameOf(Background))
If bDuploToUpdate Then
ResetCalcTotalPart()
End If
ElseIf PartModel.State > ItemState.ND And Not bLocked Then
EgtDuploSetLocked(nPartId)
End If
End If
End Sub
#End Region ' Part
#Region "Feature"
Protected Overrides Sub CreateBTLFeatureVMList()
Dim all As List(Of BTLFeatureVM) = (From BTLFeatureM In m_PartM.GetBTLFeatures()
Select New BTLFeatureVM(BTLFeatureM)).ToList()
For Each BTLFeatureVM As BTLFeatureVM In all
AddHandler BTLFeatureVM.PropertyChanged, AddressOf OnBTLFeatureVMPropertyChanged
For Each BTLParamVM As BTLParamVM In BTLFeatureVM.QBTLParamVMList
AddHandler BTLParamVM.PropertyChanged, AddressOf OnBTLQParamVMPropertyChanged
Next
AddHandler BTLFeatureVM.QBTLParamVMList.CollectionChanged, AddressOf OnBTLQParamVMListChanged
Next
m_FeatureVMList = New ObservableCollection(Of Core.BTLFeatureVM)(all)
AddHandler m_FeatureVMList.CollectionChanged, AddressOf OnBTLFeatureVMListChanged
End Sub
Friend Sub ResetCalcTotalPart()
ResetCalcPart()
For Each Feature In FeatureVMList
DirectCast(Feature, BTLFeatureVM).ResetCalcFeature()
Next
End Sub
#End Region ' Feature
#End Region ' METHODS
#Region "COMMANDS"
#Region "BackRotation"
Public ReadOnly Property BackRotation_Command As ICommand
Get
If m_cmdBackRotation Is Nothing Then
m_cmdBackRotation = New Command(AddressOf BackRotation)
End If
Return m_cmdBackRotation
End Get
End Property
Public Sub BackRotation()
' se sta calcolando, esco subito
If Map.refProjectVM.bCalcRunning Then Return
' se MachGroup gia' mandato in produzione, esco
If m_ParentMachGroupVM.nProduction_State >= ItemState.Assigned Then Return
Rotate(False)
EgtDraw()
End Sub
#End Region ' BackRotation
#Region "ForwardRotation"
Public ReadOnly Property ForwardRotation_Command As ICommand
Get
If m_cmdForwardRotation Is Nothing Then
m_cmdForwardRotation = New Command(AddressOf ForwardRotation)
End If
Return m_cmdForwardRotation
End Get
End Property
Public Sub ForwardRotation()
If Map.refProjectVM.bCalcRunning Then Return
' se MachGroup gia' mandato in produzione, esco
If m_ParentMachGroupVM.nProduction_State >= ItemState.Assigned Then Return
Rotate(True)
EgtDraw()
End Sub
#End Region ' ForwardRotation
#End Region ' COMMANDS
#Region "EVENTS"
Protected Overrides Sub OnBTLFeatureVMPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
Select Case e.PropertyName
Case NameOf(sender.bDO)
' setto pezzo da ricalcolare
ResetCalcTotalPart()
End Select
End Sub
Private Sub OnBTLQParamVMListChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
If Not IsNothing(e.NewItems) AndAlso e.NewItems.Count > 0 Then
For Each BTLParamVM As BTLParamVM In e.NewItems
AddHandler BTLParamVM.PropertyChanged, AddressOf OnBTLQParamVMPropertyChanged
Next
End If
If Not IsNothing(e.OldItems) AndAlso e.OldItems.Count > 0 Then
For Each BTLParamVM As BTLParamVM In e.OldItems
RemoveHandler BTLParamVM.PropertyChanged, AddressOf OnBTLQParamVMPropertyChanged
Next
End If
End Sub
Private Sub OnBTLQParamVMPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
Select Case e.PropertyName
Case NameOf(sender.dValue), NameOf(sender.sValue)
' setto pezzo da ricalcolare
ResetCalcTotalPart()
End Select
End Sub
#End Region ' EVENTS
End Class