Imports System.Collections.ObjectModel Imports System.IO Imports EgtBEAMWALL.Core Imports EgtUILib Imports EgtWPFLib5 Public Class LeftPanelVM Inherits VMBase #Region "FIELDS & PROPERTIES" Private Property m_GridDims As New ObservableCollection(Of GridDimension) Public Property GridDims As ObservableCollection(Of GridDimension) Get Return m_GridDims End Get Set m_GridDims = Value NotifyPropertyChanged(NameOf(GridDims)) End Set 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 Private m_LeftPanel_IsEnabled As Boolean = True Public ReadOnly Property LeftPanel_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled End Get End Property Public ReadOnly Property CopyPart_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso Not Map.refShowBeamPanelVM.bShowAll End Get End Property Public ReadOnly Property RemovePart_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso Not Map.refShowBeamPanelVM.bShowAll End Get End Property Private ReadOnly Property PartIsSelected As Boolean Get Return Not IsNothing(Map.refProjectVM) AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) End Get End Property Private ReadOnly Property FeatureIsSelected As Boolean Get Return PartIsSelected AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM) End Get End Property Public ReadOnly Property CopyFeature_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso PartIsSelected AndAlso FeatureIsSelected End Get End Property Public ReadOnly Property MacroFeature_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso PartIsSelected AndAlso FeatureIsSelected End Get End Property Public ReadOnly Property AddFeature_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso PartIsSelected End Get End Property Public ReadOnly Property RemoveFeature_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso PartIsSelected AndAlso FeatureIsSelected End Get End Property ' Definizione comandi Private m_cmdNewRawPart As ICommand Private m_cmdAddToRawPart As ICommand Private m_cmdCopyPart As ICommand Private m_cmdAddPart As ICommand Private m_cmdRemovePart As ICommand Private m_cmdCopyFeature As ICommand Private m_cmdMacroFeature As ICommand Private m_cmdAddFeature As ICommand Private m_cmdRemoveFeature As ICommand #Region "Messages" Public ReadOnly Property NewRawPart_ToopTip As String Get Return EgtMsg(61903) End Get End Property Public ReadOnly Property AddToRawPart_ToopTip As String Get Return EgtMsg(61904) End Get End Property Public ReadOnly Property CopyPart_ToopTip As String Get Return EgtMsg(61905) End Get End Property Public ReadOnly Property AddPart_ToopTip As String Get Return EgtMsg(61906) End Get End Property Public ReadOnly Property RemovePart_ToopTip As String Get Return EgtMsg(61907) End Get End Property Public ReadOnly Property CopyFeature_ToopTip As String Get Return EgtMsg(61908) End Get End Property Public ReadOnly Property MacroFeature_ToopTip As String Get Return EgtMsg(61909) End Get End Property Public ReadOnly Property AddFeature_ToopTip As String Get Return EgtMsg(61910) End Get End Property Public ReadOnly Property RemoveFeature_ToopTip As String Get Return EgtMsg(61911) End Get End Property #End Region ' Messages #End Region 'FIELDS & PROPERTIES Sub New() ' imposto riferimento su mappa Map.SetRefLeftPanelVM(Me) ' imposto dimensioni colonne/righe della Grid DimensionsIniFile.ReadGridDimensions(ConstDims.LEFTPANEL_VIEW, GridDims) End Sub #Region "METHODS" Friend Sub UpdateView() NotifyPropertyChanged(NameOf(ViewPage_Visibility)) NotifyPropertyChanged(NameOf(MachiningPage_Visibility)) End Sub Friend Sub SetLeftPanelIsEnabled(bIsEnabled As Boolean) m_LeftPanel_IsEnabled = bIsEnabled NotifyPropertyChanged(NameOf(LeftPanel_IsEnabled)) End Sub Friend Sub PartShowAllChanged() NotifyPropertyChanged(NameOf(CopyPart_IsEnabled)) NotifyPropertyChanged(NameOf(RemovePart_IsEnabled)) NotifyPropertyChanged(NameOf(AddFeature_IsEnabled)) End Sub Friend Sub FeatureSelectionChanged() NotifyPropertyChanged(NameOf(CopyFeature_IsEnabled)) NotifyPropertyChanged(NameOf(MacroFeature_IsEnabled)) NotifyPropertyChanged(NameOf(RemoveFeature_IsEnabled)) End Sub #End Region ' METHODS #Region "COMMANDS" #Region "NewRawPart" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property NewRawPart_Command As ICommand Get If m_cmdNewRawPart Is Nothing Then m_cmdNewRawPart = New Command(AddressOf NewRawPart) End If Return m_cmdNewRawPart End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub NewRawPart() If IsNothing(Map.refProdManagerVM.CurrProd) Then Return Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart If IsNothing(SelPart) 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 ' verifico se sono gia' stati messi tutti i pezzi richiesti If Not VerifyPartCount(SelPart) Then Return Dim dRawL As Double = SelPart.dL Dim dRawW As Double = SelPart.dW Dim dStartOffset As Double = 0 Dim dKerf As Double = 0 Dim dOffset As Double = WarehouseHelper.GetOffset(Map.refProjectVM.BTLStructureVM.nPROJTYPE) ' se tipo di definizione grezzo esplicito If WarehouseHelper.GetRawPartDef = 1 OrElse ((Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift AndAlso WarehouseHelper.GetWarehouseType = WarehouseType.BASIC) Then ' chiedo lunghezza grezzo Dim sWarehouseIniPath As String = Map.refMainWindowVM.MainWindowM.sWarehouseDir & "\" & WH_BASIC_INI_FILE_NAME If Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.BEAM Then dStartOffset = WarehouseHelper.GetStartOffset() dRawL += dStartOffset Else dKerf = WarehouseHelper.GetKerf() dRawL += 2 * dKerf dRawW += 2 * dKerf End If Dim AddRawPartWndVM As New AddRawPartWndVM(Map.refProjectVM.BTLStructureVM.nPROJTYPE, dRawL, dRawW, dStartOffset) Dim AddRawPartWnd As New AddRawPartWndV(Application.Current.MainWindow, AddRawPartWndVM) If Not AddRawPartWnd.ShowDialog() Then Return dRawL = AddRawPartWndVM.VariableList(0).dValue dRawW = AddRawPartWndVM.VariableList(1).dValue dStartOffset = AddRawPartWndVM.VariableList(1).dValue ' se altrimenti definizione grezzo da warehouse Else If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM Then dStartOffset = WarehouseHelper.GetStartOffset() Else dKerf = WarehouseHelper.GetKerf() End If ' se warehouse basic Select Case WarehouseHelper.GetWarehouseType() Case WarehouseType.BASIC WarehouseHelper.GetCurrentDimensions(Map.refProjectVM.BTLStructureVM.nPROJTYPE, dRawW, dRawL) Case WarehouseType.MEDIUM Dim SectionList As List(Of SParam) = WarehouseHelper.GetSectionList() Dim SParamlist As List(Of SParam) = SectionList.FindAll(Function(x) x.SectXMat = SelPart.Section) If SParamlist.Count = 0 Then ' apro finestra con solo edit If AddRawPartWnd(AddRawPartWndVM.EditTypes.ONLY_TEXT, SParamlist, dRawW, dRawL, dStartOffset, dOffset, dKerf) Then WarehouseHelper.SetOffset(Map.refProjectVM.BTLStructureVM.nPROJTYPE, dOffset) If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM Then WarehouseHelper.SetStartOffset(dStartOffset) Else WarehouseHelper.SetKerf(dKerf) End If Else Return End If ElseIf SParamlist.Count = 1 Then ' se premuto shift If (Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift Then ' imposto finestra con anche edit If AddRawPartWnd(AddRawPartWndVM.EditTypes.TEXT_AND_COMBO, SParamlist, dRawW, dRawL, dStartOffset, dOffset, dKerf) Then WarehouseHelper.SetOffset(Map.refProjectVM.BTLStructureVM.nPROJTYPE, dOffset) If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM Then WarehouseHelper.SetStartOffset(dStartOffset) Else WarehouseHelper.SetKerf(dKerf) End If Else Return End If Else ' creo grezzo con l'unico materiale dRawL = SParamlist(0).dL dRawW = SParamlist(0).dW End If Else ' imposto finestra di sola scelta dimensione Dim EditType As AddRawPartWndVM.EditTypes = AddRawPartWndVM.EditTypes.ONLY_COMBO ' se premuto shift If (Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift Then ' imposto finestra con anche edit EditType = AddRawPartWndVM.EditTypes.TEXT_AND_COMBO End If If AddRawPartWnd(EditType, SParamlist, dRawW, dRawL, dStartOffset, dOffset, dKerf) Then WarehouseHelper.SetOffset(Map.refProjectVM.BTLStructureVM.nPROJTYPE, dOffset) If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM Then WarehouseHelper.SetStartOffset(dStartOffset) Else WarehouseHelper.SetKerf(dKerf) End If Else Return End If End If End Select End If ' creo nuovo gruppo di lavorazione Map.refMachGroupPanelVM.AddMachGroup() Dim nCurrMachGroup As Integer = EgtGetCurrMachGroup() Dim sCurrMachGroupName As String = "" EgtGetMachGroupName(nCurrMachGroup, sCurrMachGroupName) ' creo copia del pezzo Dim nPartDuploId As Integer = EgtDuploNew(SelPart.nPartId) ' elimino valori calcolo dell'originale MyMachGroupPanelVM.DuploRemoveProjCalc(nPartDuploId) ' lo rendo std EgtSetMode(nPartDuploId, GDB_MD.STD) Dim sLogPath As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\RawPartLog.txt" ' scrivo dati per variabili P di comunicazione con la macchina in gruppo di lavorazione EgtSetInfo(nCurrMachGroup, MGR_RPT_PRODID, Map.refProdManagerVM.CurrProd.nProdId) EgtSetInfo(nCurrMachGroup, MGR_RPT_PATTID, nCurrMachGroup) If Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.BEAM Then ' scrivo dati costruzione grezzo in gruppo di lavorazione EgtSetInfo(nCurrMachGroup, MGR_RPT_BARLEN, dRawL) EgtSetInfo(nCurrMachGroup, MGR_RPT_MATERIAL, SelPart.sMATERIAL) EgtSetInfo(nCurrMachGroup, MGR_RPT_PART & 1, nPartDuploId & "," & dStartOffset) Dim BeamMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.GetLastMachGroup() ' eseguo script creazione grezzo If Not ExecBeam(sLogPath, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdTypes.RAWPART, False) Then BeamMachGroup.DeleteMachGroup() Dim LogFile As String() = File.ReadAllLines(sLogPath) If LogFile.Count >= 2 AndAlso Not IsNothing(LogFile(1)) Then MessageBox.Show(LogFile(1), EgtMsg(30007), MessageBoxButton.OK, MessageBoxImage.Error) End If ' se nessun grezzo, rimetto tutti i pezzi invisibili If Map.refProjectVM.MachGroupPanelVM.MachGroupVMList.Count = 0 Then Map.refProjectVM.BTLStructureVM.HideAll() End If Return End If EgtSetInfo(nPartDuploId, MGR_PRT_ROT, SelPart.nROTATED) EgtSetInfo(nPartDuploId, MGR_PRT_FLIP, SelPart.nINVERTED) ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() 'aggiorno lista pezzi BeamMachGroup.MyMachGroupM.RefreshPartList() BeamMachGroup.MyMachGroupM.RefreshGroupData() ' aggiorno dati utilizzo barra BeamMachGroup.UpdateUsage() Core.ViewPanelVM.BWSetView(VT.ISO_SW, False) ElseIf Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.WALL Then ' scrivo dati in gruppo di lavorazione Dim dPosX As Double = dKerf Dim dPosY As Double = dKerf EgtSetInfo(nCurrMachGroup, MGR_RPT_PANELLEN, dRawL) EgtSetInfo(nCurrMachGroup, MGR_RPT_PANELWIDTH, dRawW) EgtSetInfo(nCurrMachGroup, MGR_RPT_MATERIAL, SelPart.sMATERIAL) EgtSetInfo(nCurrMachGroup, MGR_RPT_PART & 1, nPartDuploId & "," & dPosX & "," & dPosY & "," & 0 & "," & 0) Dim WallMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.MachGroupVMList(Map.refMachGroupPanelVM.MachGroupVMList.Count - 1) ' eseguo script creazione grezzo If Not ExecWall(sLogPath, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdTypes.RAWPART, False) Then ' elimino duplo e gruppo di lavorazione EgtErase(nPartDuploId) WallMachGroup.DeleteMachGroup() If File.Exists(sLogPath) Then Dim LogFile As String() = File.ReadAllLines(sLogPath) If LogFile.Count >= 2 AndAlso Not IsNothing(LogFile(1)) Then MessageBox.Show(LogFile(1), EgtMsg(30007), MessageBoxButton.OK, MessageBoxImage.Error) End If Else MessageBox.Show("Impossible creating rawpart", EgtMsg(30007), MessageBoxButton.OK, MessageBoxImage.Error) End If ' se nessun grezzo, rimetto tutti i pezzi invisibili If Map.refProjectVM.MachGroupPanelVM.MachGroupVMList.Count = 0 Then Map.refProjectVM.BTLStructureVM.HideAll(True) End If Return End If ' scrivo dati pezzo EgtSetInfo(nPartDuploId, MGR_PRT_POSX, dPosX) EgtSetInfo(nPartDuploId, MGR_PRT_POSY, dPosY) EgtSetInfo(nPartDuploId, MGR_PRT_ROT, SelPart.nROTATED) EgtSetInfo(nPartDuploId, MGR_PRT_FLIP, SelPart.nINVERTED) ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() ' aggiorno lista pezzi WallMachGroup.MyMachGroupM.RefreshPartList() WallMachGroup.MyMachGroupM.RefreshGroupData() ' aggiorno dati ultilizzo barra WallMachGroup.UpdateUsage() Core.ViewPanelVM.BWSetView(VT.TOP, False) End If EgtZoom(ZM.ALL) End Sub ' funzione che apre finestra di scelta dimensioni grezzo Private Function AddRawPartWnd(EditType As AddRawPartWndVM.EditTypes, SParamlist As List(Of SParam), ByRef dRawW As Double, ByRef dRawL As Double, ByRef dStartOffset As Double, ByRef dOffset As Double, ByRef dKerf As Double) As Boolean ' apro finestra con solo edit Dim AddRawPartWndVM As New AddRawPartWndVM(EditType, Map.refProjectVM.BTLStructureVM.nPROJTYPE, SParamlist, dRawL, dRawW, dStartOffset, dOffset, dKerf) Dim AddRawPartWndV As New AddRawPartWndV(Application.Current.MainWindow, AddRawPartWndVM) If Not AddRawPartWndV.ShowDialog() Then Return False Select Case Map.refProjectVM.BTLStructureVM.nPROJTYPE Case BWType.BEAM dRawL = AddRawPartWndVM.VariableList(0).dValue dStartOffset = AddRawPartWndVM.VariableList(1).dValue dOffset = AddRawPartWndVM.VariableList(2).dValue Case BWType.WALL dRawW = AddRawPartWndVM.VariableList(0).dValue dRawL = AddRawPartWndVM.VariableList(1).dValue dKerf = AddRawPartWndVM.VariableList(2).dValue dOffset = AddRawPartWndVM.VariableList(3).dValue End Select Return True End Function Private Function VerifyPartCount(SelPart As BTLPartVM) As Boolean ' verifico se ci sono pezzi da aggiungere If Not SelPart.CanAddPartToCount Then ' se non ci sono, chiedo se aggiungerne uno nuovo If MessageBox.Show(EgtMsg(61863) & SelPart.nCNT & EgtMsg(61864) & SelPart.nADDED & EgtMsg(61865), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then SelPart.AddNewPartToAdded() Else Return False End If End If Return True End Function #End Region ' NewRawPart #Region "AddToRawPart" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property AddToRawPart_Command As ICommand Get If m_cmdAddToRawPart Is Nothing Then m_cmdAddToRawPart = New Command(AddressOf AddToRawPart) End If Return m_cmdAddToRawPart End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub AddToRawPart() If IsNothing(Map.refProdManagerVM.CurrProd) Then Return Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart If IsNothing(SelPart) Then Return Dim SelMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup If IsNothing(SelMachGroup) Then Return ' se MachGroup gia' mandato in produzione, esco If SelMachGroup.nProduction_State >= ItemState.Assigned Then Return ' verifico se sono gia' stati messi tutti i pezzi richiesti If Not VerifyPartCount(SelPart) Then Return ' verifico se impostato gruppo di lavorazione Dim nCurrMachgroupId As Integer = EgtGetCurrMachGroup() ' se nullo o diverso da quello selezionato in lista If nCurrMachgroupId = GDB_ID.NULL OrElse nCurrMachgroupId <> SelMachGroup.Id Then ' lo imposto EgtSetCurrMachGroup(SelMachGroup.Id) End If If Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.BEAM Then Dim BeamMachGroup As MyMachGroupVM = SelMachGroup ' verifico sezione e materiale If SelPart.Section <> BeamMachGroup.Section Then MessageBox.Show(EgtMsg(61866), EgtMsg(30007)) Return End If ' verifico lunghezza totale If Not VerifyTotLength(BeamMachGroup, SelPart) Then MessageBox.Show(EgtMsg(61867), EgtMsg(30007)) Return End If If AddPartToBeam(BeamMachGroup, SelPart) Then ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() End If ' aggiorno dati ultilizzo barra BeamMachGroup.UpdateUsage() Core.ViewPanelVM.BWSetView(VT.ISO_SW, False) ElseIf Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.WALL Then Dim WallMachGroup As MyMachGroupVM = SelMachGroup ' verifico spessore If SelPart.dH < WallMachGroup.dH - EPS_SMALL OrElse SelPart.dH > WallMachGroup.dH + EPS_SMALL Then MessageBox.Show(EgtMsg(61868), EgtMsg(30007)) Return End If If AddPartToWall(WallMachGroup, SelPart) Then ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() End If ' aggiorno dati ultilizzo barra WallMachGroup.UpdateUsage() Core.ViewPanelVM.BWSetView(VT.TOP, False) End If EgtZoom(ZM.ALL) End Sub Friend Function VerifyTotLength(BeamMachGroup As MyMachGroupVM, PartToAdd As BTLPartVM) As Boolean Dim dNewPartPos As Double = 0 If BeamMachGroup.PartVMList.Count > 0 Then Dim LastPart As PartVM = BeamMachGroup.PartVMList(BeamMachGroup.PartVMList.Count - 1) dNewPartPos += LastPart.dPOSX + LastPart.dL End If dNewPartPos += WarehouseHelper.GetOffset(BeamMachGroup.nType) + PartToAdd.dL Return dNewPartPos < BeamMachGroup.dL End Function Friend Function AddPartToBeam(BeamMachGroup As MyMachGroupVM, PartToAdd As BTLPartVM) As Boolean ' creo copia del pezzo Dim nPartDuploId As Integer = EgtDuploNew(PartToAdd.nPartId) ' lo rendo std EgtSetMode(nPartDuploId, GDB_MD.STD) ' calcolo posizione nuovo pezzo per rispettare ordine lunghezze Dim nInsertIndex As Integer ' scrivo dati di tutti i pezzi Dim dPosX As Double = BeamMachGroup.dStartCut Dim bPartAdded As Boolean = False Dim nIndex As Integer ' ciclo sui pezzi For nIndex = 0 To BeamMachGroup.PartVMList.Count - 1 ' se non ancora aggiunto e lunghezza minore del pezzo corrente, lo aggiungo If Not bPartAdded AndAlso BeamMachGroup.PartVMList(nIndex).dL > PartToAdd.dL Then ' se non è primo, aggiungo offset tra barre standard If nIndex <> 0 Then dPosX += WarehouseHelper.GetOffset(BeamMachGroup.nType) End If EgtSetInfo(BeamMachGroup.Id, MGR_RPT_PART & nIndex + 1, nPartDuploId & "," & DoubleToString(dPosX, 3)) ' incremento posizione della sua lunghezza dPosX += PartToAdd.dL ' conservo indice d'inserimento nInsertIndex = nIndex bPartAdded = True End If ' se non è primo, aggiungo offset del pezzo If nIndex <> 0 Then dPosX += BeamMachGroup.PartVMList(nIndex).dOffset ' se sono a indice primo ed è stato aggiunto pezzo nuovo ElseIf nIndex = 0 AndAlso bPartAdded Then ' aggiungo offset tra barre standard dPosX += WarehouseHelper.GetOffset(BeamMachGroup.nType) End If EgtSetInfo(BeamMachGroup.Id, MGR_RPT_PART & nIndex + If(bPartAdded, 2, 1), BeamMachGroup.PartVMList(nIndex).nPartId & "," & DoubleToString(dPosX, 3)) ' incremento posizione della sua lunghezza dPosX += BeamMachGroup.PartVMList(nIndex).dL Next ' se non è ancora stato aggiunto If Not bPartAdded Then ' aggiungo offset tra barre standard dPosX += WarehouseHelper.GetOffset(BeamMachGroup.nType) ' lo aggiungo in fondo EgtSetInfo(BeamMachGroup.Id, MGR_RPT_PART & nIndex + 1, nPartDuploId & "," & DoubleToString(dPosX, 3)) ' conservo indice d'inserimento nInsertIndex = nIndex End If ' elimino vecchio grezzo ed eseguo script creazione nuovo Dim nRawId As Integer = EgtGetFirstRawPart() While nRawId <> GDB_ID.NULL EgtRemoveRawPart(nRawId) nRawId = EgtGetFirstRawPart() End While If Not ExecBeam(Map.refMainWindowVM.MainWindowM.sTempDir, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdTypes.RAWPART, False) Then Return False End If EgtSetInfo(nPartDuploId, MGR_PRT_ROT, PartToAdd.nROTATED) EgtSetInfo(nPartDuploId, MGR_PRT_FLIP, PartToAdd.nINVERTED) ' aggiorno lista pezzi BeamMachGroup.MyMachGroupM.RefreshPartList() ' seleziono pezzo aggiunto If BeamMachGroup.PartVMList.Count > nInsertIndex Then BeamMachGroup.SelPart = BeamMachGroup.PartVMList(nInsertIndex) Return True End Function Friend Function AddPartToWall(WallMachGroup As MyMachGroupVM, PartToAdd As BTLPartVM) As Boolean ' creo copia del pezzo Dim nPartDuploId As Integer = EgtDuploNew(PartToAdd.nPartId) ' lo rendo std EgtSetMode(nPartDuploId, GDB_MD.STD) ' Posizione di inserimento Dim dPosX As Double = WarehouseHelper.GetKerf() Dim dPosY As Double = WarehouseHelper.GetKerf() ' Se ci sono pezzi già inseriti If WallMachGroup.PartVMList.Count > 0 Then Dim LastWall As PartVM = WallMachGroup.PartVMList(WallMachGroup.PartVMList.Count - 1) Dim LastWallPosX As Double = LastWall.dPOSX Dim LastWallPosY As Double = LastWall.PartM.dPOSY ' converto posizione ultimo pezzo nel riferimento BL Select Case CurrentMachine.NestingCorner Case MCH_CR.TL LastWallPosY = WallMachGroup.dW - LastWall.dW - LastWall.PartM.dPOSY Case MCH_CR.BL Case MCH_CR.TR LastWallPosX = WallMachGroup.dL - LastWall.dL - LastWall.dPOSX LastWallPosY = WallMachGroup.dW - LastWall.dW - LastWall.PartM.dPOSY Case MCH_CR.BR LastWallPosX = WallMachGroup.dL - LastWall.dL - LastWall.dPOSX End Select ' verifico se posso metterlo sopra in Y Dim NextPosY = LastWallPosY + LastWall.dW + WarehouseHelper.GetOffset(WallMachGroup.nType) If WallMachGroup.dW - NextPosY > PartToAdd.dW + 10 Then dPosX = LastWallPosX dPosY = NextPosY Else ' altrimenti lo affianco in X dPosX = 10 For i As Integer = 0 To WallMachGroup.PartVMList.Count - 1 Dim CurrWall As PartVM = WallMachGroup.PartVMList(i) Dim CurrWallPosX As Double = CurrWall.dPOSX ' converto posizione pezzo corrente nel riferimento BL Select Case CurrentMachine.NestingCorner Case MCH_CR.TL Case MCH_CR.BL Case MCH_CR.TR CurrWallPosX = WallMachGroup.dL - CurrWall.dL - CurrWall.dPOSX Case MCH_CR.BR CurrWallPosX = WallMachGroup.dL - CurrWall.dL - CurrWall.dPOSX End Select Dim NextPosX = CurrWallPosX + CurrWall.dL + WarehouseHelper.GetOffset(WallMachGroup.nType) If NextPosX > dPosX Then dPosX = NextPosX End If Next dPosY = 10 End If End If ' converto posizione trovata da riferimento BL a quello corrente Select Case CurrentMachine.NestingCorner Case MCH_CR.TL dPosY = WallMachGroup.dW - PartToAdd.dW - dPosY Case MCH_CR.BL Case MCH_CR.TR dPosX = WallMachGroup.dL - PartToAdd.dL - dPosX dPosY = WallMachGroup.dW - PartToAdd.dW - dPosY Case MCH_CR.BR dPosX = WallMachGroup.dL - PartToAdd.dL - dPosX End Select ' aggiungo il pezzo al grezzo If EgtAddPartToRawPart(nPartDuploId, New Point3d(dPosX, dPosY, 0), WallMachGroup.MyMachGroupM.nRawPartId) Then EgtSetInfo(nPartDuploId, MGR_PRT_POSX, dPosX) EgtSetInfo(nPartDuploId, MGR_PRT_POSY, dPosY) EgtSetInfo(nPartDuploId, MGR_PRT_ROT, PartToAdd.nROTATED) EgtSetInfo(nPartDuploId, MGR_PRT_FLIP, PartToAdd.nINVERTED) Else Return False End If 'aggiorno lista pezzi WallMachGroup.MyMachGroupM.RefreshPartList() ' seleziono pezzo aggiunto If WallMachGroup.PartVMList.Count > 0 Then WallMachGroup.SelPart = WallMachGroup.PartVMList.FirstOrDefault(Function(x) x.nPartId = nPartDuploId) Return True End Function #End Region ' AddToRawPart #Region "CopyPart" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property CopyPart_Command As ICommand Get If m_cmdCopyPart Is Nothing Then m_cmdCopyPart = New Command(AddressOf CopyPart) End If Return m_cmdCopyPart End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub CopyPart() If IsNothing(Map.refProjManagerVM.CurrProj) Then Return Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart If IsNothing(SelPart) Then Return ' creo copia Dim NewPart As BTLPartM = SelPart.Copy() If Not IsNothing(NewPart) Then ' selezione ultimo che e' quello appena creato Map.refProjectVM.BTLStructureVM.SelBTLPart = Map.refProjectVM.BTLStructureVM.BTLPartVMList(Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count - 1) End If End Sub #End Region ' CopyPart #Region "AddPart" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property AddPart_Command As ICommand Get If m_cmdAddPart Is Nothing Then m_cmdAddPart = New Command(AddressOf AddPart) End If Return m_cmdAddPart End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub AddPart(ByVal param As Object) If IsNothing(Map.refProjManagerVM.CurrProj) Then Return ' apro finestra di definizione nuovo part Dim AddPartWndVM As New AddPartWndVM() Dim AddPartWnd As New AddPartWndV(Application.Current.MainWindow, AddPartWndVM) If AddPartWnd.ShowDialog() Then ' creo nuovo part Dim nNewPartId As Integer = EgtBeamCreatePart() ' scrivo info proj EgtSetInfo(nNewPartId, BTL_PRT_PROJ, Map.refProjManagerVM.CurrProj.nProjId) EgtBeamSetPartProdNbr(AddPartWndVM.nPDN) If Not IsNothing(AddPartWndVM.sNAM) Then EgtBeamSetPartName(AddPartWndVM.sNAM) EgtBeamSetPartCount(AddPartWndVM.nCNT) EgtBeamSetPartBox(AddPartWndVM.dL, AddPartWndVM.dH, AddPartWndVM.dW) ' se progetto pareti e vista ruotata If nType = BWType.WALL AndAlso (CurrentMachine.ViewDir = VT.ISO_NW OrElse CurrentMachine.ViewDir = VT.ISO_NE) Then '' ruoto le pareti di 180 per raddrizzarle rispetto alla vista 'NewPart.Rotation(True, Map.refProjectVM.BTLStructureVM.nPROJTYPE, 180, False) ' recupero il box del pezzo Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nNewPartId, "Box") Dim b3Solid As New BBox3d EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Solid) Dim bOk As Boolean = EgtRotate(nNewPartId, b3Solid.Center, Vector3d.Z_AX, 180, GDB_RT.GLOB) If bOk Then EgtSetInfo(nNewPartId, BTL_PRT_ROTATED, 180) End If End If ' aggiungo dati pezzo Dim NewPart As BTLPartM = BTLPartM.CreateBTLPart(nNewPartId) ' aggiungo pezzo alla lista Map.refProjectVM.BTLStructureVM.BTLStructureM.AddBTLPart(NewPart) Map.refProjectVM.BTLStructureVM.SelBTLPart = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.BTLPartM Is NewPart) ' verifico se aggiungere sezione alla lista If Not Map.refProjectVM.BTLStructureVM.SectionList.Contains(Map.refProjectVM.BTLStructureVM.SelBTLPart.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Add(Map.refProjectVM.BTLStructureVM.SelBTLPart.Section) End If End If End Sub #End Region ' AddPart #Region "RemovePart" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property RemovePart_Command As ICommand Get If m_cmdRemovePart Is Nothing Then m_cmdRemovePart = New Command(AddressOf RemovePart) End If Return m_cmdRemovePart End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub RemovePart() If IsNothing(Map.refProjManagerVM.CurrProj) Then Return If IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) Then Return ' verifico se ci sono già copie in grezzi Dim nDuploCount As Integer = 0 If EgtDuploCount(Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId, nDuploCount) AndAlso nDuploCount > 0 Then ' avviso che il pezzo non è cancellabile perchè in produzione MessageBox.Show(String.Format(EgtMsg(61929), nDuploCount), EgtMsg(15003), MessageBoxButton.OK, MessageBoxImage.Warning) Return End If ' verifico se rimuovere sezione dalla lista If Not Map.refProjectVM.BTLStructureVM.BTLPartVMList.Any(Function(x) x IsNot Map.refProjectVM.BTLStructureVM.SelBTLPart AndAlso x.Section = Map.refProjectVM.BTLStructureVM.SelBTLPart.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Remove(Map.refProjectVM.BTLStructureVM.SelBTLPart.Section) End If ' Eseguo cancellazione EgtBeamSetPart(Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId) If EgtBeamErasePart() Then ' rimuovo dalla lista pezzi Dim Index As Integer = Map.refProjectVM.BTLStructureVM.BTLPartVMList.IndexOf(Map.refProjectVM.BTLStructureVM.SelBTLPart) If Index = 0 Then If Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count > 1 Then Map.refProjectVM.BTLStructureVM.SelBTLPart = Map.refProjectVM.BTLStructureVM.BTLPartVMList(1) Else Map.refProjectVM.BTLStructureVM.SelBTLPart = Nothing End If ElseIf Index = Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count - 1 Then If Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count > 1 Then Map.refProjectVM.BTLStructureVM.SelBTLPart = Map.refProjectVM.BTLStructureVM.BTLPartVMList(Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count - 2) Else Map.refProjectVM.BTLStructureVM.SelBTLPart = Nothing End If Else Map.refProjectVM.BTLStructureVM.SelBTLPart = Map.refProjectVM.BTLStructureVM.BTLPartVMList(Index - 1) End If Map.refProjectVM.BTLStructureVM.BTLPartVMList.RemoveAt(Index) End If End Sub #End Region ' RemovePart #Region "CopyFeature" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property CopyFeature_Command As ICommand Get If m_cmdCopyFeature Is Nothing Then m_cmdCopyFeature = New Command(AddressOf CopyFeature) End If Return m_cmdCopyFeature End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub CopyFeature() If IsNothing(Map.refProjManagerVM.CurrProj) Then Return Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart If IsNothing(SelPart) Then Return Dim SelFeature As BTLFeatureVM = SelPart.SelBTLFeatureVM If IsNothing(SelFeature) Then Return ' creo copia Dim NewFeature = SelFeature.Copy() If Not IsNothing(NewFeature) Then Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.FirstOrDefault(Function(x) x.BTLFeatureM Is NewFeature) End If End Sub #End Region ' CopyFeature #Region "MacroFeature" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property MacroFeature_Command As ICommand Get If m_cmdMacroFeature Is Nothing Then m_cmdMacroFeature = New Command(AddressOf MacroFeature) End If Return m_cmdMacroFeature End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub MacroFeature() If IsNothing(Map.refProjManagerVM.CurrProj) Then Return If IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) Then Return ' apro finestra di creazione macro Dim MacroFeatureWndVM As New MacroFeatureWndVM() Dim MacroFeatureWnd As New MacroFeatureWndV(Application.Current.MainWindow, MacroFeatureWndVM) If MacroFeatureWnd.ShowDialog() Then End If End Sub #End Region ' MacroFeature #Region "AddFeature" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property AddFeature_Command As ICommand Get If m_cmdAddFeature Is Nothing Then m_cmdAddFeature = New Command(AddressOf AddFeature) End If Return m_cmdAddFeature End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub AddFeature(ByVal param As Object) If IsNothing(Map.refProjManagerVM.CurrProj) Then Return If IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) Then Return ' apro finestra di definizione nuova feature Dim AddFeatureWndVM As New AddFeatureWndVM() Dim AddFeatureWnd As New AddFeatureWndV(Application.Current.MainWindow, AddFeatureWndVM) If AddFeatureWnd.ShowDialog() Then Dim NewFeat As BTLFeatureM Dim nNewFeatureId As Integer = 0 Dim bMacroFlag As Boolean = False ' verifico se una Macro è selezionata If AddFeatureWndVM.MacroList.Count > 0 AndAlso AddFeatureWndVM.nSelMacro >= 0 Then ' Creo nuova feature sulla base della Macro selezionata ' Creo table e setto variabili EgtLuaCreateGlobTable("MACRO") EgtLuaSetGlobNumVar("MACRO.L", Map.refProjectVM.BTLStructureVM.SelBTLPart.dBtlL) EgtLuaSetGlobNumVar("MACRO.W", Map.refProjectVM.BTLStructureVM.SelBTLPart.dBtlW) EgtLuaSetGlobNumVar("MACRO.H", Map.refProjectVM.BTLStructureVM.SelBTLPart.dBtlH) EgtLuaSetGlobIntVar("MACRO.PROCID", Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLPartM.NewProcId()) Dim bOk = EgtLuaExecFile(AddFeatureWndVM.m_MacroFilePathList(AddFeatureWndVM.nSelMacro)) ' Leggo variabili EgtLuaGetGlobIntVar("MACRO.FEATUREID", nNewFeatureId) ' Reset lua EgtLuaResetGlobVar("MACRO") If Not bOk Then MessageBox.Show(EgtMsg(61869), EgtMsg(30007)) Return End If bMacroFlag = True Else ' Creo nuova feature (Macro non selezionata) NewFeat = BTLFeatureM.CreateBTLFeature(AddFeatureWndVM.nSelPRC.nPRC, AddFeatureWndVM.nSelPRC.nGRP, AddFeatureWndVM.nSelPRC.nSIDE) NewFeat.SetDefaultValues() Dim vPar() As Double = Nothing Dim sPar As String = String.Empty Dim vParQ() As String = Nothing NewFeat.CalcParamArray(vPar, sPar, vParQ) ' aggiorno la feature con nuovo valore EgtBeamSetPart(Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId) nNewFeatureId = EgtBeamAddProcess(NewFeat.nSelGRP, NewFeat.nPRC, NewFeat.nSelSIDE, "", Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLPartM.NewProcId(), New Frame3d(), vPar, sPar, vParQ, GDB_ID.NULL, GDB_ID.NULL) bMacroFlag = False End If ' se è stata creata If nNewFeatureId <> GDB_ID.NULL Then ' la aggiungo a struttura BTL corrente NewFeat = BTLFeatureM.CreateBTLFeature(Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLPartM, nNewFeatureId) If Not bMacroFlag Then NewFeat.SetDefaultValues() Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLPartM.AddBTLFeature(NewFeat) Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.FirstOrDefault(Function(x) x.BTLFeatureM Is NewFeat) End If End If End Sub #End Region ' AddFeature #Region "RemoveFeature" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property RemoveFeature_Command As ICommand Get If m_cmdRemoveFeature Is Nothing Then m_cmdRemoveFeature = New Command(AddressOf RemoveFeature) End If Return m_cmdRemoveFeature End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub RemoveFeature() If IsNothing(Map.refProjManagerVM.CurrProj) Then Return If IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) Then Return If IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM) Then Return If EgtBeamEraseProcess(Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM.nFeatureId) Then ' rimuovo dalla lista pezzi Dim Index As Integer = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.IndexOf(Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM) If Index = 0 Then If Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.Count > 0 Then Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList(0) Else Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM = Nothing End If ElseIf Index = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.Count - 1 Then If Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.Count > 1 Then Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList(Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.Count - 2) Else Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM = Nothing End If Else Map.refProjectVM.BTLStructureVM.SelBTLPart.SelBTLFeatureVM = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList(Index - 1) End If Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.RemoveAt(Index) EgtDraw() End If End Sub #End Region ' RemoveFeature #End Region ' COMMANDS End Class