Imports System.Collections.ObjectModel Imports System.IO Imports EgtBEAMWALL.Core Imports EgtUILib Imports EgtWPFLib5 Public Class LeftPanelVM Inherits VMBase #Region "FIELDS & PROPERTIES" 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 ' 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 #End Region 'FIELDS & PROPERTIES Sub New() ' imposto riferimento su mappa Map.SetRefLeftPanelVM(Me) End Sub #Region "METHODS" Friend Sub UpdateView() NotifyPropertyChanged("ViewPage_Visibility") NotifyPropertyChanged("MachiningPage_Visibility") 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() Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart If IsNothing(SelPart) Then Return ' verifico se sono gia' stati messi tutti i pezzi richiesti If Not VerifyPartCount(SelPart) Then Return ' Determino il tipo di macchina (travi o pareti) Dim nMachType As MachineType = Map.refMachinePanelVM.SelectedMachine.nType ' chiedo lunghezza grezzo Dim AddRawPartWndVM As New AddRawPartWndVM(Map.refMachinePanelVM.SelectedMachine.nType, SelPart.dL, SelPart.dW, 0) Dim AddRawPartWnd As New AddRawPartWndV(Application.Current.MainWindow, AddRawPartWndVM) If Not AddRawPartWnd.ShowDialog() Then Return ' 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 DuploRemoveProjCalc(nPartDuploId) ' lo rendo std EgtSetMode(nPartDuploId, GDB_MD.STD) Dim sLogPath As String = Map.refMainWindowVM.MainWindowM.sTempDir & "\RawPartLog.txt" If Map.refMachinePanelVM.SelectedMachine.nType = MachineType.BEAM Then ' 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) ' scrivo dati costruzione grezzo in gruppo di lavorazione EgtSetInfo(nCurrMachGroup, MGR_RPT_BARLEN, AddRawPartWndVM.VariableList(0).dValue) EgtSetInfo(nCurrMachGroup, MGR_RPT_PART & 1, nPartDuploId & "," & AddRawPartWndVM.VariableList(1).dValue) Dim BeamMachGroup As BeamMachGroupVM = Map.refMachGroupPanelVM.GetLastMachGroup() ' eseguo script creazione grezzo If Not ExecBeam(sLogPath, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdType.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), "Error", MessageBoxButton.OK, MessageBoxImage.Error) End If Return End If ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() 'aggiorno lista pezzi BeamMachGroup.m_BeamMachGroupM.RefreshPartList() BeamMachGroup.m_BeamMachGroupM.RefreshGroupData() ' aggiorno dati ultilizzo barra BeamMachGroup.UpdateUsage() EgtSetView(VT.ISO_SW, False) ElseIf Map.refMachinePanelVM.SelectedMachine.nType = MachineType.WALL Then ' scrivo dati in gruppo di lavorazione Dim dPosX = 10 Dim dPosY = 10 EgtSetInfo(nCurrMachGroup, MGR_RPT_PANELLEN, AddRawPartWndVM.VariableList(0).dValue) EgtSetInfo(nCurrMachGroup, MGR_RPT_PANELWIDTH, AddRawPartWndVM.VariableList(1).dValue) EgtSetInfo(nCurrMachGroup, MGR_RPT_PART & 1, nPartDuploId & "," & dPosX & "," & dPosY & "," & 0 & "," & 0) Dim WallMachGroup As WallMachGroupVM = DirectCast(Map.refMachGroupPanelVM.MachGroupVMList(Map.refMachGroupPanelVM.MachGroupVMList.Count - 1), WallMachGroupVM) ' eseguo script creazione grezzo If Not ExecWall(sLogPath, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdType.RAWPART, False) Then WallMachGroup.DeleteMachGroup() Dim LogFile As String() = File.ReadAllLines(sLogPath) If LogFile.Count >= 2 AndAlso Not IsNothing(LogFile(1)) Then MessageBox.Show(LogFile(1), "Error", MessageBoxButton.OK, MessageBoxImage.Error) 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, 0) EgtSetInfo(nPartDuploId, MGR_PRT_FLIP, False) ' aggiorno lista pezzi WallMachGroup.m_WallMachGroupM.RefreshPartList() WallMachGroup.m_WallMachGroupM.RefreshGroupData() ' aggiorno dati ultilizzo barra WallMachGroup.UpdateUsage() EgtSetView(VT.TOP, False) End If EgtZoom(ZM.ALL) End Sub Private Function VerifyPartCount(SelPart As BTLPartVM) As Boolean ' verifico se ci sono pezzi da aggiungere If SelPart.nCNT + SelPart.nADDED = SelPart.nINPROD Then ' se non ci sono, chiedo se aggiungerne uno nuovo If MessageBox.Show("Raggiunto numero di pezzi da produrre: " & SelPart.nCNT & " da BTL; " & SelPart.nADDED & " aggiunti. Aggiungerne un altro?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then SelPart.AddNewPartToAdded() Else Return False End If End If Return True End Function Private Sub DuploRemoveProjCalc(nPartDuploId As Integer) EgtSetInfo(nPartDuploId, ITG_PROJ_ERR, "") EgtSetInfo(nPartDuploId, ITG_PROJ_MSG, "") EgtSetInfo(nPartDuploId, ITG_PROJ_ROT, "") EgtSetInfo(nPartDuploId, ITG_PROJ_FALL, "") EgtSetInfo(nPartDuploId, ITG_PROJ_TIME, "") End Sub 'Friend Sub IncrementPartCount(SelPart As BTLPartVM) ' ' incremento i pezzi utilizzati ' SelPart.AddPartToProd() 'End Sub #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() Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.SelBTLPart If IsNothing(SelPart) Then Return Dim SelMachGroup As MachGroupVM = Map.refMachGroupPanelVM.SelectedMachGroup If IsNothing(SelMachGroup) Then Return ' verifico se sono gia' stati messi tutti i pezzi richiesti If Not VerifyPartCount(SelPart) Then Return If Map.refMachinePanelVM.SelectedMachine.nType = MachineType.BEAM Then Dim BeamMachGroup As BeamMachGroupVM = DirectCast(SelMachGroup, BeamMachGroupVM) ' verifico sezione If SelPart.dW < BeamMachGroup.dW - EPS_SMALL OrElse SelPart.dW > BeamMachGroup.dW + EPS_SMALL OrElse SelPart.dH < BeamMachGroup.dH - EPS_SMALL OrElse SelPart.dH > BeamMachGroup.dH + EPS_SMALL Then MessageBox.Show("Il pezzo selezionato ha sezione diversa dalla barra selezionata. Impossibile aggiungerlo.", "Errore") Return End If ' verifico lunghezza totale If Not VerifyTotLength(BeamMachGroup, SelPart) Then MessageBox.Show("Il pezzo selezionato supera la lunghezza dalla barra selezionata. Impossibile aggiungerlo.", "Errore") Return End If If AddPartToBeam(BeamMachGroup, SelPart) Then ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() End If ' aggiorno dati ultilizzo barra BeamMachGroup.UpdateUsage() EgtSetView(VT.ISO_SW, False) ElseIf Map.refMachinePanelVM.SelectedMachine.nType = MachineType.WALL Then Dim WallMachGroup As WallMachGroupVM = DirectCast(SelMachGroup, WallMachGroupVM) ' verifico spessore If SelPart.dH < WallMachGroup.dH - EPS_SMALL OrElse SelPart.dH > WallMachGroup.dH + EPS_SMALL Then MessageBox.Show("Il pezzo selezionato ha spessore diverso dalla parete selezionata. Impossibile aggiungerlo.", "Errore") Return End If If AddPartToWall(WallMachGroup, SelPart) Then ' aggiorno contatore pezzi usati in Prod SelPart.RefreshPartInProd() End If ' aggiorno dati ultilizzo barra WallMachGroup.UpdateUsage() EgtSetView(VT.TOP, False) End If EgtZoom(ZM.ALL) End Sub Friend Function VerifyTotLength(BeamMachGroup As BeamMachGroupVM, 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 += RawPartConfiguration.dBeamDist + PartToAdd.dL Return dNewPartPos < BeamMachGroup.dL End Function Friend Function AddPartToBeam(BeamMachGroup As BeamMachGroupVM, 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 += RawPartConfiguration.dBeamDist 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 Dim Beam As BeamVM = DirectCast(BeamMachGroup.PartVMList(nIndex), BeamVM) dPosX += Beam.dOffset ' se sono a indice primo ed è stato aggiunto pezzo nuovo ElseIf nIndex = 0 AndAlso bPartAdded Then ' aggiungo offset tra barre standard dPosX += RawPartConfiguration.dBeamDist 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 += RawPartConfiguration.dBeamDist ' 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.CmdType.RAWPART, False) Then Return False End If ' aggiorno lista pezzi BeamMachGroup.m_BeamMachGroupM.RefreshPartList() ' seleziono pezzo aggiunto If BeamMachGroup.PartVMList.Count > nInsertIndex Then BeamMachGroup.SelPart = BeamMachGroup.PartVMList(nInsertIndex) Return True End Function Friend Function AddPartToWall(WallMachGroup As WallMachGroupVM, 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 = 10 Dim dPosY As Double = 10 ' Se ci sono pezzi già inseriti If WallMachGroup.PartVMList.Count > 0 Then Dim LastWall As WallVM = DirectCast(WallMachGroup.PartVMList(WallMachGroup.PartVMList.Count - 1), WallVM) ' verifico se posso metterlo sopra in Y Dim NextPosY = LastWall.m_WallM.dPOSY + LastWall.dW + RawPartConfiguration.dWallDist If WallMachGroup.dW - NextPosY > PartToAdd.dW + 10 Then dPosX = LastWall.dPOSX dPosY = NextPosY Else dPosX = 10 For i As Integer = 0 To WallMachGroup.PartVMList.Count - 1 Dim CurrWall As WallVM = DirectCast(WallMachGroup.PartVMList(i), WallVM) Dim NextPosX = CurrWall.dPOSX + CurrWall.dL + RawPartConfiguration.dWallDist If NextPosX > dPosX Then dPosX = NextPosX End If Next dPosY = 10 End If End If If EgtAddPartToRawPart(nPartDuploId, New Point3d(dPosX, dPosY, 0), WallMachGroup.m_WallMachGroupM.nRawPartId) Then EgtSetInfo(nPartDuploId, MGR_PRT_POSX, dPosX) EgtSetInfo(nPartDuploId, MGR_PRT_POSY, dPosY) EgtSetInfo(nPartDuploId, MGR_PRT_ROT, 0) EgtSetInfo(nPartDuploId, MGR_PRT_FLIP, False) Else Return False End If '' scrivo dati in gruppo di lavorazione 'EgtSetInfo(WallMachGroup.Id, MGR_RPT_PART & WallMachGroup.PartVMList.Count + 1, nPartDuploId & "," & dPosX & "," & dPosY & "," & 0 & "," & 0) '' eseguo script creazione grezzo 'Dim nRawId As Integer = EgtGetFirstRawPart() 'While nRawId <> GDB_ID.NULL ' EgtRemoveRawPart(nRawId) ' nRawId = EgtGetFirstRawPart() 'End While 'If Not ExecWall(Map.refMainWindowVM.MainWindowM.sTempDir, Map.refMachinePanelVM.SelectedMachine.Name, CalcIntegration.CmdType.RAWPART, False) Then Return False 'aggiorno lista pezzi WallMachGroup.m_WallMachGroupM.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() 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 crerato 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) ' 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) ' 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) 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.refProjectVM.BTLStructureVM.SelBTLPart) Then Return 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 > 0 Then Map.refProjectVM.BTLStructureVM.SelBTLPart = Map.refProjectVM.BTLStructureVM.BTLPartVMList(0) 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() 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.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.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.dL) EgtLuaSetGlobNumVar("MACRO.W", Map.refProjectVM.BTLStructureVM.SelBTLPart.dW) EgtLuaSetGlobNumVar("MACRO.H", Map.refProjectVM.BTLStructureVM.SelBTLPart.dH) 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("Errore nell'esecuzione del file Macro!", "Errore") 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 NewFeat.CalcParamArray(vPar, sPar) ' 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) 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 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