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 AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Not Map.refProjectVM.BTLStructureVM.SelBTLPartsCnt > 1 End Get End Property Public ReadOnly Property RemovePart_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled End Get End Property Public ReadOnly Property RotatePart_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso Not IsNothing(Map.refProjectVM) AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refProjectVM.BTLStructureVM.SelBTLParts.Count > 1 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 AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Not Map.refProjectVM.BTLStructureVM.SelBTLPartsCnt > 1 End Get End Property Public ReadOnly Property RemoveFeature_IsEnabled As Boolean Get Return m_LeftPanel_IsEnabled AndAlso PartIsSelected AndAlso FeatureIsSelected End Get End Property Public ReadOnly Property SearchFilter_IsEnabled As Boolean Get Return Not Map.refFreeContourManagerVM.bIsActive End Get End Property ' Definizione comandi Private m_cmdNewRawPart As ICommand Private m_cmdNewRawPartLast As ICommand Private m_cmdAddToRawPart As ICommand Private m_cmdCopyPart As ICommand Private m_cmdAddPart As ICommand Private m_cmdRemovePart As ICommand Private m_cmdInvert As ICommand Private m_cmdBackRotation As ICommand Private m_cmdForwardRotation 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 SearchFilter_Msg As String Get Return "Search & Filter" End Get End Property Public ReadOnly Property Section_Msg As String Get Return EgtMsg(61771) End Get End Property Public ReadOnly Property Group_Msg As String Get Return EgtMsg(61624) End Get End Property Public ReadOnly Property SubGroup_Msg As String Get Return EgtMsg(61623) End Get End Property Public ReadOnly Property ParType_Msg As String Get Return EgtMsg(61950) End Get End Property Public ReadOnly Property ParValue_Msg As String Get Return EgtMsg(61951) End Get End Property Public ReadOnly Property NewRawPart_ToolTip As String Get Return EgtMsg(61903) End Get End Property Public ReadOnly Property NewRawPartLast_ToolTip As String Get Return EgtMsg(61977) End Get End Property Public ReadOnly Property AddToRawPart_ToolTip As String Get Return EgtMsg(61904) End Get End Property Public ReadOnly Property CopyPart_ToolTip As String Get Return EgtMsg(61905) End Get End Property Public ReadOnly Property AddPart_ToolTip As String Get Return EgtMsg(61906) End Get End Property Public ReadOnly Property RemovePart_ToolTip As String Get Return EgtMsg(61907) End Get End Property Public ReadOnly Property CopyFeature_ToolTip As String Get Return EgtMsg(61908) End Get End Property Public ReadOnly Property MacroFeature_ToolTip As String Get Return EgtMsg(61909) End Get End Property Public ReadOnly Property AddFeature_ToolTip As String Get Return EgtMsg(61910) End Get End Property Public ReadOnly Property RemoveFeature_ToolTip 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)) NotifyPropertyChanged(NameOf(CopyPart_IsEnabled)) NotifyPropertyChanged(NameOf(RemovePart_IsEnabled)) NotifyPropertyChanged(NameOf(CopyFeature_IsEnabled)) NotifyPropertyChanged(NameOf(AddFeature_IsEnabled)) NotifyPropertyChanged(NameOf(RemoveFeature_IsEnabled)) NotifyPropertyChanged(NameOf(MacroFeature_IsEnabled)) NotifyPropertyChanged(NameOf(SearchFilter_IsEnabled)) End Sub Friend Sub PartShowAllChanged() NotifyPropertyChanged(NameOf(CopyPart_IsEnabled)) NotifyPropertyChanged(NameOf(RemovePart_IsEnabled)) NotifyPropertyChanged(NameOf(RotatePart_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 NewRawPartCmd) End If Return m_cmdNewRawPart End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub NewRawPartCmd() NewRawPart(False) End Sub Public Sub NewRawPart(bLast As Boolean) If IsNothing(Map.refProdManagerVM.CurrProd) Then Return Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart Dim SelParts As List(Of BTLPartVM) = Map.refProjectVM.BTLStructureVM.SelBTLParts.ToList() If IsNothing(SelParts) OrElse SelParts.Count <= 0 Then Return ' verifico che abbiano tutti la stessa sezione Dim dHSection As Double = SelParts(0).dH Dim dWSection As Double = SelParts(0).dW For PartIndex = 0 To SelParts.Count - 1 Dim Part As BTLPartVM = SelParts(PartIndex) If Not IsNothing(Part) Then If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM Then If Part.dH <> dHSection OrElse Part.dW <> dWSection Then MessageBox.Show(EgtMsg(61970), EgtMsg(30007)) Return End If ElseIf Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL Then If Part.dH <> dHSection Then MessageBox.Show(EgtMsg(61970), EgtMsg(30007)) Return End If End If Else SelParts.Remove(Part) End If Next ' se pareti e piu' di uno selezionato, esco If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL And SelParts.Count > 1 Then MessageBox.Show(EgtMsg(61971), EgtMsg(30007)) Return End If ' 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(SelParts) Then Return Dim dRawL As Double = SelParts(0).dL Dim dRawW As Double = SelParts(0).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 = SelParts(0).Section) If bLast Then Dim LastMaterial As SParam = WarehouseHelper.GetLastMaterial(SelParts(0).Section) If Not IsNothing(LastMaterial) Then dRawL = LastMaterial.dL dRawW = LastMaterial.dW ElseIf SParamlist.Count > 0 Then dRawL = SParamlist(0).dL dRawW = SParamlist(0).dW Else MessageBox.Show(EgtMsg(61975), EgtMsg(30007)) Return End If Else 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 > 0 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 End If End If End Select End If If Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.BEAM Then ' verifico se lunghezza barra e' maggiore della lunghezza dei pezzi Dim dTotLen As Double = WarehouseHelper.GetStartOffset() For PartIndex = 0 To SelParts.Count - 1 If PartIndex <> 0 Then dTotLen += WarehouseHelper.GetOffset(BWType.BEAM) End If dTotLen += SelParts(PartIndex).dL Next If dTotLen > dRawL Then MessageBox.Show(EgtMsg(61972), EgtMsg(30007)) Return End If End If ' creo nuovo gruppo di lavorazione Map.refMachGroupPanelVM.AddMachGroup() Dim nCurrMachGroup As Integer = EgtGetCurrMachGroup() Dim sCurrMachGroupName As String = "" EgtGetMachGroupName(nCurrMachGroup, sCurrMachGroupName) 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 ' ordino i pezzi per lunghezza SelParts = SelParts.OrderBy(Function(x) x.dL).ToList ' creo copie dei pezzi Dim nPartDuploIdList As New List(Of Integer) For Each Part In SelParts Dim nDuploId As Integer = EgtDuploNew(Part.nPartId) ' elimino valori calcolo dell'originale MyMachGroupPanelVM.DuploRemoveProjCalc(nDuploId) ' lo rendo std EgtSetMode(nDuploId, GDB_MD.STD) nPartDuploIdList.Add(nDuploId) Next ' scrivo dati costruzione grezzo in gruppo di lavorazione EgtSetInfo(nCurrMachGroup, MGR_RPT_BARLEN, dRawL) EgtSetInfo(nCurrMachGroup, MGR_RPT_MATERIAL, SelPart.sMATERIAL) ' scrivo dati di tutti i pezzi Dim dPosX As Double = WarehouseHelper.GetStartOffset() ' ciclo sui pezzi For nIndex = 0 To nPartDuploIdList.Count - 1 ' se non è primo, aggiungo offset tra barre standard If nIndex <> 0 Then dPosX += WarehouseHelper.GetOffset(BWType.BEAM) End If EgtSetInfo(nCurrMachGroup, MGR_RPT_PART & nIndex + 1, nPartDuploIdList(nIndex) & "," & DoubleToString(dPosX, 3)) ' incremento posizione della sua lunghezza dPosX += SelParts(nIndex).dL Next Dim BeamMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.GetLastMachGroup() ' eseguo script creazione grezzo Dim nERR As Integer = 0 If Not ExecBeam(sLogPath, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdTypes.RAWPART, False) Then ' elimino duplo e gruppo di lavorazione For Each nDuploId In nPartDuploIdList EgtErase(nDuploId) Next BeamMachGroup.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(EgtMsg(61973), 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 For nDuploIndex = 0 To SelParts.Count - 1 EgtSetInfo(nPartDuploIdList(nDuploIndex), MGR_PRT_ROT, SelParts(nDuploIndex).nROTATED) EgtSetInfo(nPartDuploIdList(nDuploIndex), MGR_PRT_FLIP, SelParts(nDuploIndex).nINVERTED) Next ' aggiorno contatore pezzi usati in Prod For Each SelPart In SelParts SelPart.RefreshPartInProd() Next '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 Dim nPartDuploId As Integer = EgtDuploNew(SelPart.nPartId) ' 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 & "," & DoubleToString(dPosX, 3) & "," & DoubleToString(dPosY, 3) & ",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, 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(EgtMsg(61973), 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 ' verifico se il materiale esiste in magazzino o devo aggiungerlo Dim CurrSParam As SParam = Nothing Select Case EditType Case AddRawPartWndVM.EditTypes.ONLY_TEXT ' lo aggiungo a lista materiali in magazzino CurrSParam = AddRawMaterial(dRawW, dRawL) Case AddRawPartWndVM.EditTypes.ONLY_COMBO ' non faccio nulla Case AddRawPartWndVM.EditTypes.TEXT_AND_COMBO ' verifico se lunghezza testo corrisponde a materiale If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM Then CurrSParam = SParamlist.FirstOrDefault(Function(x) x.dL = AddRawPartWndVM.VariableList(0).dValue) Else CurrSParam = SParamlist.FirstOrDefault(Function(x) x.dL = AddRawPartWndVM.VariableList(1).dValue AndAlso x.dW = AddRawPartWndVM.VariableList(0).dValue) End If If IsNothing(CurrSParam) Then ' lo aggiungo a lista materiali in magazzino CurrSParam = AddRawMaterial(dRawW, dRawL) End If End Select ' imposto il materiale selezionato come ultimo utilizzato SetLastMaterial(CurrSParam.SectXMat, CurrSParam) Return True End Function Private Function AddRawMaterial(dRawW As Double, ByRef dRawL As Double) As SParam Dim sWarehousePath As String = Map.refMainWindowVM.MainWindowM.sWarehouseDir & "\" & WH_MEDIUM_INI_FILE_NAME Dim nQuantity As Integer = GetMainPrivateProfileInt(S_WAREHOUSE, K_DEFAULTQUANTITY, 1) If Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.BEAM Then ' creo sParam Dim CurrSParam As New SParam(Map.refProjectVM.BTLStructureVM.SelBTLPart.Section, dRawL, nQuantity, False) Dim sL As String = String.Empty sL = LenToString(CurrSParam.dL, 3) ' ricavo l'indice del SecionXMaterial dalla Beam_List Dim SectXMatIndex As Integer = GetSectIndexFromSection(MachineType.BEAM, CurrSParam.SectXMat) 'Dim sSxMValue As String = "" 'While EgtUILib.GetPrivateProfileString(S_BEAM_LIST, SectXMatIndex, String.Empty, sSxMValue, sWarehousePath) ' Dim sSectXMatValues() As String = sSxMValue.Split(","c) ' ' creo parametro ' Dim dW As Double = 0 ' Dim dH As Double = 0 ' Dim sMaterial As String = sSectXMatValues(2) ' StringToLen(sSectXMatValues(0), dW) ' StringToLen(sSectXMatValues(1), dH) ' If CurrSParam.SectXMat.dW = dW AndAlso CurrSParam.SectXMat.dH = dH AndAlso CurrSParam.SectXMat.sMaterial(0) = sMaterial Then ' ' se l'ho trovato esco dal while, il SectXMatIndex è l'indice che cercavamo ' Exit While ' End If ' SectXMatIndex += 1 'End While ' ricavo nuovo indice materiale Dim ParamIndex As Integer = 1 Dim sParam As String = "" While GetPrivateProfileString(S_BEAM, K_L & ParamIndex, "", sParam, sWarehousePath) > 0 ParamIndex += 1 End While If SectXMatIndex > 0 Then ' lo aggiungo in warehouse WritePrivateProfileString(S_BEAM, K_L & ParamIndex, SectXMatIndex & "," & sL & "," & CurrSParam.nQuantity & "," & If(CurrSParam.bActive, 1, 0), sWarehousePath) Else EgtOutLog("Error in material creation, section not found!") End If Return CurrSParam ElseIf Map.refProjectVM.BTLStructureVM.nPROJTYPE = MachineType.WALL Then ' creo sParam Dim CurrSParam As New SParam(Map.refProjectVM.BTLStructureVM.SelBTLPart.Section, dRawW, dRawL, nQuantity, False) Dim sW As String = String.Empty Dim sL As String = String.Empty sW = LenToString(CurrSParam.dW, 3) sL = LenToString(CurrSParam.dL, 3) ' ricavo l'indice del SecionXMaterial dalla Wall_List Dim SectXMatIndex As Integer = 1 Dim sSxMValue As String = "" While EgtUILib.GetPrivateProfileString(S_WALL_LIST, SectXMatIndex, String.Empty, sSxMValue, sWarehousePath) If sSxMValue = CurrSParam.sValue Then ' se l'ho trovato esco dal while, il SectXMatIndex è l'indice che cercavamo Exit While End If SectXMatIndex += 1 End While ' ricavo nuovo indice materiale Dim ParamIndex As Integer = 1 Dim sParam As String = "" While GetPrivateProfileString(S_WALL, K_S & ParamIndex, "", sParam, sWarehousePath) = 0 ParamIndex += 1 End While ' lo aggiungo in warehouse WritePrivateProfileString(S_WALL, K_S & ParamIndex, SectXMatIndex & "," & sW & "," & sL & "," & CurrSParam.nQuantity & "," & If(CurrSParam.bActive, 1, 0), sWarehousePath) Return CurrSParam End If Return Nothing End Function Private Function VerifyPartCount(SelParts As List(Of BTLPartVM)) As Boolean ' verifico se ci sono pezzi da aggiungere Dim ToAddList As New List(Of String) Dim ToAddVM As New List(Of BTLPartVM) For Each SelPart In SelParts If Not SelPart.CanAddPartToCount Then ToAddList.Add(SelPart.nCNT & EgtMsg(61864) & SelPart.nADDED & EgtMsg(61865)) ToAddVM.Add(SelPart) End If Next ' se non ci sono, chiedo se aggiungerne uno nuovo If ToAddList.Count > 0 Then Dim sMessage As String = EgtMsg(61863) & Environment.NewLine For Each sPart In ToAddList sMessage &= " - " & sPart & Environment.NewLine Next If MessageBox.Show(sMessage & EgtMsg(61893), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then For Each PartVM In ToAddVM PartVM.AddNewPartToAdded() Next Else Return False End If End If Return True End Function #End Region ' NewRawPart #Region "NewRawPartLast" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property NewRawPartLast_Command As ICommand Get If m_cmdNewRawPartLast Is Nothing Then m_cmdNewRawPartLast = New Command(AddressOf NewRawPartLast) End If Return m_cmdNewRawPartLast End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub NewRawPartLast() NewRawPart(True) End Sub #End Region ' NewRawPartLast #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 Dim SelParts As List(Of BTLPartVM) = Map.refProjectVM.BTLStructureVM.SelBTLParts.ToList() For Index = 0 To SelParts.Count() - 1 If IsNothing(SelParts(Index)) Then SelParts.RemoveAt(Index) End If Next If IsNothing(SelPart) Then Return If IsNothing(SelParts) OrElse SelParts.Count <= 0 Then Return Dim SelMachGroup As MyMachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup If IsNothing(SelMachGroup) Then Return ' se pareti e piu' di uno selezionato, esco If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL And SelParts.Count > 1 Then MessageBox.Show(EgtMsg(61971), EgtMsg(30007)) Return End If ' 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(SelParts) 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 For Each Part In SelParts If Part.Section <> BeamMachGroup.Section Then MessageBox.Show(EgtMsg(61866), EgtMsg(30007)) Return End If Next ' verifico lunghezza totale If Not VerifyTotLength(BeamMachGroup, SelParts) Then MessageBox.Show(EgtMsg(61867), EgtMsg(30007)) Return End If If AddPartToBeam(BeamMachGroup, SelParts) Then ' aggiorno contatore pezzi usati in Prod For Each Part In SelParts Part.RefreshPartInProd() Next ' resetto stato di calc SelMachGroup.ResetCalcMachGroup() 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.Section <> WallMachGroup.Section Then MessageBox.Show(EgtMsg(61868), EgtMsg(30007)) Return End If If AddPartToWall(WallMachGroup, SelPart) Then ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() ' resetto stato di calc SelMachGroup.ResetCalcMachGroup() 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, PartsToAdd As List(Of 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 For Each Part In PartsToAdd dNewPartPos += WarehouseHelper.GetOffset(BeamMachGroup.nType) + Part.dL Next Return dNewPartPos < BeamMachGroup.dL End Function Friend Function AddPartToBeam(BeamMachGroup As MyMachGroupVM, PartsToAdd As List(Of BTLPartVM)) As Boolean ' ordino i pezzi da aggiungere PartsToAdd = PartsToAdd.OrderBy(Function(x) x.dL).ToList() ' creo copie dei pezzi Dim nPartDuploIdList As New List(Of Integer) For Each Part In PartsToAdd Dim nDuploId As Integer = EgtDuploNew(Part.nPartId) ' elimino valori calcolo dell'originale MyMachGroupPanelVM.DuploRemoveProjCalc(nDuploId) ' lo rendo std EgtSetMode(nDuploId, GDB_MD.STD) nPartDuploIdList.Add(nDuploId) Next ' 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 nPartIndex As Integer = 0 Dim nIndex As Integer ' ciclo sui pezzi For nIndex = 0 To BeamMachGroup.PartVMList.Count - 1 For PartsToAddIndex = nPartIndex To PartsToAdd.Count - 1 Dim Part As BTLPartVM = PartsToAdd(PartsToAddIndex) ' se non ancora aggiunto e lunghezza minore del pezzo corrente, lo aggiungo If nPartIndex < nPartDuploIdList.Count() AndAlso BeamMachGroup.PartVMList(nIndex).dL > Part.dL Then ' se non è primo, aggiungo offset tra barre standard If nIndex <> 0 OrElse nPartIndex <> 0 Then dPosX += WarehouseHelper.GetOffset(BeamMachGroup.nType) End If EgtSetInfo(BeamMachGroup.Id, MGR_RPT_PART & nIndex + nPartIndex + 1, nPartDuploIdList(nPartIndex) & "," & DoubleToString(dPosX, 3)) ' incremento posizione della sua lunghezza dPosX += Part.dL ' conservo indice d'inserimento nInsertIndex = nIndex nPartIndex += 1 Else Exit For End If Next ' 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 nPartIndex > 0 Then ' aggiungo offset tra barre standard dPosX += WarehouseHelper.GetOffset(BeamMachGroup.nType) End If EgtSetInfo(BeamMachGroup.Id, MGR_RPT_PART & nIndex + nPartIndex + 1, BeamMachGroup.PartVMList(nIndex).nPartId & "," & DoubleToString(dPosX, 3)) ' incremento posizione della sua lunghezza dPosX += BeamMachGroup.PartVMList(nIndex).dL Next ' se non è ancora stato aggiunto For PartsToAddIndex = nPartIndex To PartsToAdd.Count - 1 ' aggiungo offset tra barre standard dPosX += WarehouseHelper.GetOffset(BeamMachGroup.nType) ' lo aggiungo in fondo EgtSetInfo(BeamMachGroup.Id, MGR_RPT_PART & nIndex + nPartIndex + 1, nPartDuploIdList(nPartIndex) & "," & DoubleToString(dPosX, 3)) ' conservo indice d'inserimento nInsertIndex = nIndex nPartIndex += 1 Next ' elimino vecchio grezzo ed eseguo script creazione nuovo Dim nRawId As Integer = EgtGetFirstRawPart() While nRawId <> GDB_ID.NULL EgtRemoveRawPart(nRawId) nRawId = EgtGetFirstRawPart() End While Dim sLogPath As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\RawPartLog.txt" If Not ExecBeam(sLogPath, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdTypes.RAWPART, False) Then Return False End If For nDuploIndex = 0 To PartsToAdd.Count - 1 EgtSetInfo(nPartDuploIdList(nDuploIndex), MGR_PRT_ROT, PartsToAdd(nDuploIndex).nROTATED) EgtSetInfo(nPartDuploIdList(nDuploIndex), MGR_PRT_FLIP, PartsToAdd(nDuploIndex).nINVERTED) Next ' 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.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList(Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count - 1), False, True) 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) Dim NewPartVM As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.BTLPartM Is NewPart) If Not IsNothing(NewPartVM) Then EgtZoom(ZM.ALL) Map.refProjectVM.BTLStructureVM.SetSelBTLPart(NewPartVM, False, True) ' verifico se aggiungere sezione alla lista If Not Map.refProjectVM.BTLStructureVM.SectionList.Contains(NewPartVM.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Add(NewPartVM.Section) End If 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 RemovePartCmd) End If Return m_cmdRemovePart End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub RemovePartCmd() If IsNothing(Map.refProjManagerVM.CurrProj) Then Return If Map.refProjectVM.BTLStructureVM.SelBTLParts.Count > 0 Then Dim CurrSelBTLParts As List(Of BTLPartVM) = Map.refProjectVM.BTLStructureVM.SelBTLParts.ToList() For RemoveIndex = CurrSelBTLParts.Count - 1 To 0 Step -1 RemovePart(CurrSelBTLParts(RemoveIndex), RemoveIndex = 0) ' imposto vista tutti i pezzi 'Map.refShowBeamPanelVM.ShowAll(RemoveIndex = 0) Next End If End Sub Public Sub RemovePart(BTLPartToDelete As BTLPartVM, bSelPrevious As Boolean) ' verifico se ci sono già copie in grezzi Dim nDuploCount As Integer = 0 If EgtDuploCount(BTLPartToDelete.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 BTLPartToDelete AndAlso x.Section = BTLPartToDelete.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Remove(BTLPartToDelete.Section) Map.refProjectVM.BTLStructureVM.SelSection = SectionXMaterial.Empty End If ' Eseguo cancellazione EgtBeamSetPart(BTLPartToDelete.nPartId) If EgtBeamErasePart() Then ' seleziono elemento precedente Dim Index As Integer = Map.refProjectVM.BTLStructureVM.BTLPartVMList.IndexOf(BTLPartToDelete) Dim FilteredIndex As Integer = Map.refProjectVM.BTLStructureVM.BTLPartVMList_View.IndexOf(BTLPartToDelete) Map.refProjectVM.BTLStructureVM.SelBTLParts.Remove(BTLPartToDelete) If bSelPrevious Then If FilteredIndex = 0 Then If Map.refProjectVM.BTLStructureVM.BTLPartVMList_View.Count > 1 Then Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList_View(1)) Else Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Nothing) End If ElseIf FilteredIndex = Map.refProjectVM.BTLStructureVM.BTLPartVMList_View.Count - 1 Then If Map.refProjectVM.BTLStructureVM.BTLPartVMList_View.Count > 1 Then Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList_View(Map.refProjectVM.BTLStructureVM.BTLPartVMList_View.Count - 2)) Else Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Nothing) End If Else Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList_View(FilteredIndex - 1)) End If End If ' rimuovo dalla lista pezzi Map.refProjectVM.BTLStructureVM.BTLPartVMList.RemoveAt(Index) End If End Sub #End Region ' RemovePart #Region "Invert" ''' ''' Returns a command that do Exec. ''' Public ReadOnly Property Invert_Command As ICommand Get If m_cmdInvert Is Nothing Then m_cmdInvert = New Command(AddressOf Invert) End If Return m_cmdInvert End Get End Property ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub Invert() If IsNothing(Map.refProjManagerVM.CurrProj) OrElse IsNothing(Map.refProjectVM.BTLStructureVM) Then Return ' se modalita' assemblato Dim bShowBuilding As Boolean = Map.refShowBeamPanelVM.ShowBuilding_IsChecked If bShowBuilding AndAlso Map.refShowBeamPanelVM.bShowAll Then ' devo smontarlo prima di ruotare le travi Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False) End If ' inverto i pezzi selezionati For Each Part In Map.refProjectVM.BTLStructureVM.SelBTLParts Part.Invert() Next ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) End Sub #End Region ' BackRotation #Region "BackRotation" ''' ''' Returns a command that do Exec. ''' 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 ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub BackRotation() If IsNothing(Map.refProjManagerVM.CurrProj) OrElse IsNothing(Map.refProjectVM.BTLStructureVM) Then Return ' salvo sezione impostata Dim CurrSection As SectionXMaterial = Map.refProjectVM.BTLStructureVM.SelSection ' se modalita' assemblato Dim bShowBuilding As Boolean = Map.refShowBeamPanelVM.ShowBuilding_IsChecked If bShowBuilding AndAlso Map.refShowBeamPanelVM.bShowAll Then ' devo smontarlo prima di ruotare le travi Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False) End If ' ruoto i pezzi selezionati For Each Part In Map.refProjectVM.BTLStructureVM.SelBTLParts Part.BackRotation(False, False) Next ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) ' se progetto travi e sezione precedente diversa da vuota (tutti i pezzi) If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM AndAlso CurrSection <> SectionXMaterial.Empty Then ' se esiste, imposto sezione inversa Dim InverseSection As SectionXMaterial = Map.refProjectVM.BTLStructureVM.SectionList.FirstOrDefault(Function(x) x.dH = CurrSection.dW AndAlso x.dW = CurrSection.dH AndAlso x.sMaterial(0) = CurrSection.sMaterial(0)) If Not IsNothing(InverseSection) Then Map.refProjectVM.BTLStructureVM.SetSelSection(InverseSection) End If EgtDraw() End Sub #End Region ' BackRotation #Region "ForwardRotation" ''' ''' Returns a command that do Exec. ''' 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 ''' ''' Execute the Exec. This method is invoked by the ExecCommand. ''' Public Sub ForwardRotation() If IsNothing(Map.refProjManagerVM.CurrProj) OrElse IsNothing(Map.refProjectVM.BTLStructureVM) Then Return ' salvo sezione impostata Dim CurrSection As SectionXMaterial = Map.refProjectVM.BTLStructureVM.SelSection ' se modalita' assemblato Dim bShowBuilding As Boolean = Map.refShowBeamPanelVM.ShowBuilding_IsChecked If bShowBuilding AndAlso Map.refShowBeamPanelVM.bShowAll Then ' devo smontarlo prima di ruotare le travi Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False) End If ' ruoto i pezzi selezionati For Each Part In Map.refProjectVM.BTLStructureVM.SelBTLParts Part.ForwardRotation(False, False) Next ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) ' se progetto travi e sezione precedente diversa da vuota (tutti i pezzi) If Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM AndAlso CurrSection <> SectionXMaterial.Empty Then ' se esiste, imposto sezione inversa Dim InverseSection As SectionXMaterial = Map.refProjectVM.BTLStructureVM.SectionList.FirstOrDefault(Function(x) x.dH = CurrSection.dW AndAlso x.dW = CurrSection.dH AndAlso x.sMaterial(0) = CurrSection.sMaterial(0)) If Not IsNothing(InverseSection) Then Map.refProjectVM.BTLStructureVM.SetSelSection(InverseSection) End If EgtDraw() End Sub #End Region ' ForwardRotation #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 SelPart.SelBTLFeatureVM = Map.refProjectVM.BTLStructureVM.SelBTLPart.BTLFeatureVMList.FirstOrDefault(Function(x) x.BTLFeatureM Is NewFeature) EgtDuploSetModified(SelPart.nPartId) End If SelPart.ResetCalcPart() 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 EgtDuploSetModified(Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId) ' 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) Map.refProjectVM.BTLStructureVM.SelBTLPart.ResetCalcPart() 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 EgtDuploSetModified(Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId) ' rimuovo dalla lista feature 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() Map.refProjectVM.BTLStructureVM.SelBTLPart.ResetCalcPart() End If End Sub #End Region ' RemoveFeature #End Region ' COMMANDS End Class