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