Imports System.Collections.ObjectModel Imports System.Collections.Specialized Imports System.ComponentModel Imports System.IO Imports System.Web.UI.WebControls.WebParts Imports System.Windows.Threading Imports EgtBEAMWALL.Core Imports EgtUILib Imports EgtWPFLib5 Public Class BTLStructureVM Inherits VMBase #Region "FIELDS & PROPERTIES" Private DOWN_IMAGE As String = "pack://application:,,,/Resources/NewPage/down.png" ' Nome file NGE con i pezzi selezionati per effettuare UpdateBTL Friend Const UPDATEBTL_NGE As String = "UpdateBTL.nge" Friend Enum SelectionTypes As Integer NULL = 0 SELECT_ = 1 HIGHLIGHT = 2 End Enum Private m_Calc_PartEnd As New DispatcherTimer Private WithEvents m_BTLStructureM As BTLStructureM Public ReadOnly Property BTLStructureM As BTLStructureM Get Return m_BTLStructureM End Get End Property ' pezzi da BTL Private m_BTLPartVMList_View As CollectionView = Nothing Public ReadOnly Property BTLPartVMList_View As CollectionView Get Return m_BTLPartVMList_View End Get End Property Private m_BTLPartVMList As ObservableCollection(Of BTLPartVM) Public Property BTLPartVMList As ObservableCollection(Of BTLPartVM) Get Return m_BTLPartVMList End Get Set(value As ObservableCollection(Of BTLPartVM)) m_BTLPartVMList = value End Set End Property Private m_bOnlySelectItem As Boolean = False Public Property bOnlySelectItem As Boolean Get Return m_bOnlySelectItem End Get Set(value As Boolean) m_bOnlySelectItem = value End Set End Property Private m_SelBTLParts As New PartsObservableCollection(Of BTLPartVM) Public ReadOnly Property SelBTLParts As PartsObservableCollection(Of BTLPartVM) Get Return m_SelBTLParts End Get End Property Private Sub SelBTLParts_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs) ' Setto contesto finestra principale If Map.refShowBeamPanelVM.ShowBuilding_IsChecked Then EgtSetCurrentContext(Map.refSceneHostVM.MainScene.GetCtx()) If m_bOnlySelectItem Then Return Select Case e.Action Case NotifyCollectionChangedAction.Add If e.NewItems.Count > 0 AndAlso Not IsNothing(e.NewItems(0)) Then SelectBTLPart(e.NewItems(0)) End If Case NotifyCollectionChangedAction.Remove If e.OldItems.Count > 0 AndAlso Not IsNothing(e.OldItems(0)) Then DeselectBTLPart(e.OldItems(0)) End If Case NotifyCollectionChangedAction.Reset If Not IsNothing(m_SelBTLPart) Then DeselectBTLPart(m_SelBTLPart) End If End Select ' gestione pulsanti ruota, inverti tutti e modifica multipla If m_SelBTLParts.Count > 1 Then Map.refLeftPanelVM.SetRotateAll_IsEnabled(True) Else Map.refLeftPanelVM.SetRotateAll_IsEnabled(False) End If ' aggiornamento grafica If Not IsNothing(Map.refFeatureListManagerVM) Then Map.refFeatureListManagerVM.PartShowAllChanged() If Not IsNothing(Map.refBTLPartManagerVM) Then Map.refBTLPartManagerVM.PartShowAllChanged() End Sub Public Sub SelectBTLPart(BtlPart As BTLPartVM, Optional bIsReselect As Boolean = False) m_SelBTLPart = BtlPart If Map.refProjectVM.LastSelGridType = ProjectVM.GridSelTypes.MACHGROUP Then ' resetto gruppo di lavorazione corrente EgtResetCurrMachGroup() End If If Not IsNothing(BtlPart) Then ' gestisco selezione pezzo EgtBeamShowFacesName(False) EgtBeamShowLoadingSide(False, False) Map.refProjectVM.MacroFeature_IsEnabled = True ' se modalità building, la tolgo If Map.refShowBeamPanelVM.ShowBuilding_IsChecked Then ShowBuilding(False, False) Map.refShowBeamPanelVM.SetShowBuilding(False) Map.refProjectVM.SetSceneShowBuldingVisibility(False) Map.refProjectVM.SetManagerTabVisibility(True) If Not IsNothing(Map.refProjectVM.MachGroupPanelVM) Then Map.refProjectVM.SetFeatureListVisibility(True) End If SceneSelPartSelection() ' seleziono pezzo in Db geometrico EgtBeamSetPart(BtlPart.nPartId) EgtBeamShowFacesName(True) Dim bLoadingSideShow As Boolean = (nPROJTYPE = BWType.BEAM) Dim bLeftToRight As Boolean = Not (CurrentMachine.ViewDir = VT.ISO_NW OrElse CurrentMachine.ViewDir = VT.ISO_NE) EgtBeamShowLoadingSide(bLoadingSideShow, bLeftToRight) ' trovo ed evidenzio MachGroup e Duplo di questo pezzo If Not IsNothing(Map.refProjectVM.MachGroupPanelVM) Then For Each Machgroup As MyMachGroupVM In Map.refProjectVM.MachGroupPanelVM.MachGroupVMList Dim bFound As Boolean = False For Each Part As PartVM In Machgroup.PartVMList If EgtDuploGetOriginal(Part.nPartId) = BtlPart.nPartId Then Part.SetSearchFound() bFound = True Else Part.ResetSearchFound() End If Next If bFound Then Machgroup.SetSearchFound() Else Machgroup.ResetSearchFound() End If Next End If End If ' seleziono la prima feature If Not IsNothing(BtlPart) AndAlso Not IsNothing(BtlPart.BTLFeatureVMList) AndAlso BtlPart.BTLFeatureVMList.Count > 0 Then SelBTLPart.SelBTLFeatureVM = BtlPart.BTLFeatureVMList(0) ' Mostro le strategie forzate Dim bValue As Boolean = False Dim bValueForced As Boolean = False For Each FeatureParam As BTLFeatureVM In SelBTLPart.BTLFeatureVMList bValue = False EgtGetInfo(FeatureParam.nFeatureId, ConstBeam.STRATEGY & FeatureParam.nFeatureId & "_FORCED", bValue) If bValue Then SelBTLPart.SetStrategyModify_Visibility(True) FeatureParam.SetbStrategy_Visibility(True) End If For Each StrategySetupParam As StrategySetup In Map.refStrategyManagerVM.StrategySetupList For Each StrategyFeatureParam As StrategyFeature In StrategySetupParam.StrategyFeatureList For Each TopologyParam As Topology In StrategyFeatureParam.TopologyList For Each StrategyParam As Strategy In TopologyParam.StrategyList For Each Param As StrategyParameter In StrategyParam.ParameterList bValueForced = False EgtGetInfo(FeatureParam.nFeatureId, StrategyParam.sStrategyId & "_" & Param.sNameNge & "_FORCED", bValueForced) If bValueForced Then FeatureParam.SetbStrategy_Visibility(True) Next Next Next Next Next Next ' aggiorno stato selezionato tutto Map.refShowBeamPanelVM.bShowAll = False Core.ViewPanelVM.BWSetView(If(Core.ViewPanelVM.Type = BWType.BEAM, VT.ISO_SW, VT.TOP), False) EgtZoom(ZM.ALL) Map.refProdManagerVM.SetBtlImage(DOWN_IMAGE) Map.refProdManagerVM.SetOpenImage(DOWN_IMAGE) Map.refProdManagerVM.SetSaveImage(DOWN_IMAGE) NotifyPropertyChanged(NameOf(SelBTLPart)) If Not bIsReselect AndAlso m_SelBTLParts.Count = 1 Then BtlPart.SetOpenFeatureList(True) End Sub Private Sub DeselectBTLPart(BtlPart As BTLPartVM) ' se necessario tolgo solido dal precedentemente selezionato Configuration.DeselectSolid(BtlPart.nPartId, True) If m_SelBTLPart Is BtlPart Then EgtBeamShowFacesName(False) EgtBeamShowLoadingSide(False, False) m_SelBTLPart = Nothing NotifyPropertyChanged(NameOf(SelBTLPart)) End If ' disabilito eventuale feature selezionata If Not IsNothing(BtlPart.m_SelBTLFeatureVM) Then BtlPart.SelBTLFeatureVM = Nothing End If EgtDraw() If m_SelBTLParts.Count = 1 Then m_SelBTLParts(0).SetOpenFeatureList(True) End If If BtlPart.bOpenFeatureList Then BtlPart.SetOpenFeatureList(False) End If End Sub Public Sub SelectBTLPartScene(BtlPart As BTLPartVM, Optional bIsReselect As Boolean = False) m_SelBTLPart = BtlPart If Map.refProjectVM.LastSelGridType = ProjectVM.GridSelTypes.MACHGROUP Then ' resetto gruppo di lavorazione corrente EgtResetCurrMachGroup() End If If Not IsNothing(BtlPart) Then ' gestisco selezione pezzo EgtBeamShowFacesName(False) EgtBeamShowLoadingSide(False, False) Map.refProjectVM.MacroFeature_IsEnabled = True SceneSelPartSelection() ' seleziono pezzo in Db geometrico EgtBeamSetPart(BtlPart.nPartId) EgtBeamShowFacesName(True) Dim bLoadingSideShow As Boolean = (nPROJTYPE = BWType.BEAM) Dim bLeftToRight As Boolean = Not (CurrentMachine.ViewDir = VT.ISO_NW OrElse CurrentMachine.ViewDir = VT.ISO_NE) EgtBeamShowLoadingSide(bLoadingSideShow, bLeftToRight) ' trovo ed evidenzio MachGroup e Duplo di questo pezzo If Not IsNothing(Map.refProjectVM.MachGroupPanelVM) Then Dim MachGroupList As New List(Of MyMachGroupVM) For Each Machgroup As MyMachGroupVM In Map.refProjectVM.MachGroupPanelVM.MachGroupVMList Dim bFound As Boolean = False For Each Part As PartVM In Machgroup.PartVMList If EgtDuploGetOriginal(Part.nPartId) = BtlPart.nPartId Then Part.SetSearchFound() bFound = True Else Part.ResetSearchFound() End If Next If bFound Then Machgroup.SetSearchFound() Else Machgroup.ResetSearchFound() End If Next End If End If ' seleziono la prima feature If Not IsNothing(BtlPart) AndAlso Not IsNothing(BtlPart.BTLFeatureVMList) AndAlso BtlPart.BTLFeatureVMList.Count > 0 Then SelBTLPart.SetSelFeature(SelBTLPart.SelBTLFeatureVM) Core.ViewPanelVM.BWSetView(If(Core.ViewPanelVM.Type = BWType.BEAM, VT.ISO_SW, VT.TOP), False) EgtZoom(ZM.ALL) NotifyPropertyChanged(NameOf(SelBTLPart)) If Not bIsReselect AndAlso m_SelBTLParts.Count = 1 Then BtlPart.SetOpenFeatureList(True) End Sub Private m_SelBTLPart As BTLPartVM = Nothing Public ReadOnly Property SelBTLPart As BTLPartVM Get Return m_SelBTLPart End Get End Property Friend Sub SetSelBTLPart(SelBTLPart As BTLPartVM, Optional bByOptim As Boolean = False, Optional bSingleHighlight As Boolean = False) If bByOptim Then ' annullo evidenziazione MachGroup e Duplo If Not IsNothing(Map.refProjectVM.MachGroupPanelVM) Then For Each Machgroup As MyMachGroupVM In Map.refProjectVM.MachGroupPanelVM.MachGroupVMList For Each Part As PartVM In Machgroup.PartVMList Part.ResetSearchFound() Next Machgroup.ResetSearchFound() Next End If End If If bByOptim Then m_bOnlySelectItem = True End If If bByOptim Or bSingleHighlight Then If SelBTLParts.Contains(SelBTLPart) Then For Each Part In SelBTLParts.ToList() If Part IsNot SelBTLPart Then SelBTLParts.Remove(Part) Next Else SelBTLParts.Clear() End If End If If Not IsNothing(SelBTLPart) Then SelBTLParts.AddToList(SelBTLPart) If bByOptim Then m_bOnlySelectItem = False End If End Sub ' lista parametri per ricerca testuale Private m_SearchParamList As New ObservableCollection(Of IdNameStruct)({New IdNameStruct(BTLPartParam.NULL, ""), New IdNameStruct(BTLPartParam.PDN, EgtMsg(61809)), New IdNameStruct(BTLPartParam.NAM, EgtMsg(61603))}) Public ReadOnly Property SearchParamList As ObservableCollection(Of IdNameStruct) Get Return m_SearchParamList End Get End Property Private m_SelSearchParam As IdNameStruct = m_SearchParamList(0) Public Property SelSearchParam As IdNameStruct Get Return m_SelSearchParam End Get Set(value As IdNameStruct) ' resetto il contenuto della barra di ricerca testuale e refresho la lista dei Part (in modo da averli visibili tutti) SearchText = "" NotifyPropertyChanged(NameOf(SearchText)) ' ora setto il valore scelto come Parameter Type m_SelSearchParam = value End Set End Property ' lista dei gruppi Private m_GroupList_View As CollectionView = Nothing Private m_GroupList As New ObservableCollection(Of String)({""}) Public Property GroupList As ObservableCollection(Of String) Get Return m_GroupList End Get Set(value As ObservableCollection(Of String)) m_GroupList = value End Set End Property Private m_SelGroup As String = "" Public Property SelGroup As String Get Return m_SelGroup End Get Set(value As String) m_SelGroup = value m_BTLPartVMList_View.Refresh() m_SectionList_View.Refresh() m_SubGroupList_View.Refresh() End Set End Property ' lista dei SubGroup Private m_SubGroupList_View As CollectionView = Nothing Private m_SubGroupList As New ObservableCollection(Of String)({""}) Public Property SubGroupList As ObservableCollection(Of String) Get Return m_SubGroupList End Get Set(value As ObservableCollection(Of String)) m_SubGroupList = value End Set End Property Private m_SelSubGroup As String = "" Public Property SelSubGroup As String Get Return m_SelSubGroup End Get Set(value As String) m_SelSubGroup = value m_BTLPartVMList_View.Refresh() m_SectionList_View.Refresh() m_GroupList_View.Refresh() End Set End Property ' lista delle sezioni utilizzate Private m_SectionList_View As CollectionView = Nothing Private m_SectionList As New ObservableCollection(Of SectionXMaterial)({SectionXMaterial.Empty}) Public Property SectionList As ObservableCollection(Of SectionXMaterial) Get Return m_SectionList End Get Set(value As ObservableCollection(Of SectionXMaterial)) m_SectionList = value End Set End Property Private m_SelSection As SectionXMaterial = SectionXMaterial.Empty Public Property SelSection As SectionXMaterial Get Return m_SelSection End Get Set(value As SectionXMaterial) If Not IsNothing(value) Then m_SelSection = value m_BTLPartVMList_View.Refresh() m_GroupList_View.Refresh() m_SubGroupList_View.Refresh() End If End Set End Property Friend Sub SetSelSection(value As SectionXMaterial) If Not IsNothing(value) Then m_SelSection = value m_BTLPartVMList_View.Refresh() m_GroupList_View.Refresh() m_SubGroupList_View.Refresh() End If NotifyPropertyChanged(NameOf(SelSection)) End Sub Private m_SearchText As String = "" Public Property SearchText As String Get Return m_SearchText End Get Set(value As String) m_SearchText = value m_BTLPartVMList_View.Refresh() m_GroupList_View.Refresh() m_SectionList_View.Refresh() End Set End Property Public Property bDOALL As Boolean? Get If BTLPartVMList.Count = 0 Then Return False Dim bTemp As Boolean = BTLPartVMList(0).bDO For FeatureIndex = 1 To BTLPartVMList.Count - 1 If BTLPartVMList(FeatureIndex).bDO <> bTemp Then Return Nothing Next Return bTemp End Get Set(value As Boolean?) If BTLPartVMList.Count = 0 Then NotifyPropertyChanged(NameOf(bDOALL)) Return End If For PartIndex = 0 To BTLPartVMList.Count - 1 Dim Part As BTLPartVM = BTLPartVMList(PartIndex) If (IsNothing(m_SelSection) OrElse m_SelSection.dH = -1 OrElse Part.Section = m_SelSection) AndAlso (SelGroup = "" OrElse Part.sGROUP = SelGroup) AndAlso (SelSubGroup = "" OrElse Part.sSTOREY = SelSubGroup) AndAlso (SelSearchParam.Id = BTLPartParam.NULL OrElse SearchText = String.Empty OrElse ( (SelSearchParam.Id = BTLPartParam.PDN AndAlso Part.nPDN.ToString.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) >= 0) OrElse (SelSearchParam.Id = BTLPartParam.NAM AndAlso Part.sNAM.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) >= 0))) Then Part.bDO = value Part.NotifyPropertyChanged(NameOf(Part.bDO)) End If Next End Set End Property #Region "Parametri generici" Public Property sPROJNUM As String Get Return m_BTLStructureM.m_sPROJNUM End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_PROJNUM, value) Then m_BTLStructureM.m_sPROJNUM = value Else NotifyPropertyChanged(NameOf(sPROJNUM)) End If End Set End Property Public Property sPROJNAME As String Get Return m_BTLStructureM.m_sPROJNAME End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_PROJNAME, value) Then m_BTLStructureM.m_sPROJNAME = value Else NotifyPropertyChanged(NameOf(sPROJNAME)) End If End Set End Property Public Property sPROJPART As String Get Return m_BTLStructureM.m_sPROJPART End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_PROJPART, value) Then m_BTLStructureM.m_sPROJPART = value Else NotifyPropertyChanged(NameOf(sPROJPART)) End If End Set End Property Public Property sPROJGUID As String Get Return m_BTLStructureM.m_sPROJGUID End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_PROJGUID, value) Then m_BTLStructureM.m_sPROJGUID = value Else NotifyPropertyChanged(NameOf(sPROJGUID)) End If End Set End Property Public ReadOnly Property nPROJTYPE As BWType Get Select Case Map.refMainMenuVM.SelPage Case Pages.OPTIMIZERPAGE Return Map.refProdManagerVM.nProdType Case Else Return BWType.NULL End Select End Get End Property Public Property sLISTNAME As String Get Return m_BTLStructureM.m_sLISTNAME End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_LISTNAME, value) Then DbControllers.m_ProjController.UpdateListName(ProjectManagerVM.CurrProj.nProjId, value) m_BTLStructureM.m_sLISTNAME = value Else NotifyPropertyChanged(NameOf(sLISTNAME)) End If End Set End Property Public Property sCUSTOMER As String Get Return m_BTLStructureM.m_sCUSTOMER End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_CUSTOMER, value) Then m_BTLStructureM.m_sCUSTOMER = value Else NotifyPropertyChanged(NameOf(sCUSTOMER)) End If End Set End Property Public Property sARCHITECT As String Get Return m_BTLStructureM.m_sARCHITECT End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_ARCHITECT, value) Then m_BTLStructureM.m_sARCHITECT = value Else NotifyPropertyChanged(NameOf(sARCHITECT)) End If End Set End Property Public Property sEDITOR As String Get Return m_BTLStructureM.m_sEDITOR End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_EDITOR, value) Then m_BTLStructureM.m_sEDITOR = value Else NotifyPropertyChanged(NameOf(sEDITOR)) End If End Set End Property Public Property sDELIVDATE As String Get Return m_BTLStructureM.m_sDELIVDATE End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_DELIVDATE, value) Then m_BTLStructureM.m_sDELIVDATE = value Else NotifyPropertyChanged(NameOf(sDELIVDATE)) End If End Set End Property Public Property sEXPDATE As String Get Return m_BTLStructureM.m_sEXPDATE End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_EXPDATE, value) Then m_BTLStructureM.m_sEXPDATE = value Else NotifyPropertyChanged(NameOf(sEXPDATE)) End If End Set End Property Public Property sEXPTIME As String Get Return m_BTLStructureM.m_sEXPTIME End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_EXPTIME, value) Then m_BTLStructureM.m_sEXPTIME = value Else NotifyPropertyChanged(NameOf(sEXPTIME)) End If End Set End Property Public Property sEXPRELEASE As String Get Return m_BTLStructureM.m_sEXPRELEASE End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_EXPRELEASE, value) Then m_BTLStructureM.m_sEXPRELEASE = value Else NotifyPropertyChanged(NameOf(sEXPRELEASE)) End If End Set End Property Public Property sLANGUAGE As String Get Return m_BTLStructureM.m_sLANGUAGE End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_LANGUAGE, value) Then m_BTLStructureM.m_sLANGUAGE = value Else NotifyPropertyChanged(NameOf(sLANGUAGE)) End If End Set End Property Public ReadOnly Property ocRANGE As List(Of Object) Get Return m_BTLStructureM.ocRANGE End Get End Property Public Property SelRANGE As Integer Get Return m_BTLStructureM.m_SelRANGE End Get Set(value As Integer) Dim nValue As Integer = IdNameStruct.IdFromInd(value, m_BTLStructureM.ocRANGE) Dim sValue As String = [Enum].GetName(GetType(Range), nValue) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_RANGE, sValue) Then m_BTLStructureM.m_SelRANGE = value Else NotifyPropertyChanged(NameOf(SelRANGE)) End If End Set End Property Public ReadOnly Property ocPROCESSINGQUALITY As List(Of Object) Get Return m_BTLStructureM.ocPROCESSINGQUALITY End Get End Property Public Property SelPROCESSINGQUALITY As Integer Get Return m_BTLStructureM.m_SelPROCESSINGQUALITY End Get Set(value As Integer) Dim nValue As Integer = IdNameStruct.IdFromInd(value, m_BTLStructureM.ocPROCESSINGQUALITY) Dim sValue As String = [Enum].GetName(GetType(ProcessingQuality), nValue) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_PRT_PROCESSINGQUALITY, sValue) Then m_BTLStructureM.m_SelPROCESSINGQUALITY = value Else NotifyPropertyChanged(NameOf(SelPROCESSINGQUALITY)) End If End Set End Property Public Property sCOMPUTERNAME As String Get Return m_BTLStructureM.m_sCOMPUTERNAME End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_COMPUTERNAME, value) Then m_BTLStructureM.m_sCOMPUTERNAME = value Else NotifyPropertyChanged(NameOf(sCOMPUTERNAME)) End If End Set End Property Public Property sUSER As String Get Return m_BTLStructureM.m_sUSER End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_USER, value) Then m_BTLStructureM.m_sUSER = value Else NotifyPropertyChanged(NameOf(sUSER)) End If End Set End Property Public Property sSRCFILE As String Get Return m_BTLStructureM.m_sSRCFILE End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_SRCFILE, value) Then m_BTLStructureM.m_sSRCFILE = value Else NotifyPropertyChanged(NameOf(sSRCFILE)) End If End Set End Property Public Property sEXPFILE As String Get Return m_BTLStructureM.m_sEXPFILE End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_EXPFILE, value) Then m_BTLStructureM.m_sEXPFILE = value Else NotifyPropertyChanged(NameOf(sEXPFILE)) End If End Set End Property Public ReadOnly Property ocRECESS As List(Of Object) Get Return m_BTLStructureM.ocRECESS End Get End Property Public Property SelRECESS As Integer Get Return m_BTLStructureM.m_SelRECESS End Get Set(value As Integer) Dim nValue As Integer = IdNameStruct.IdFromInd(value, m_BTLStructureM.ocRECESS) Dim sValue As String = [Enum].GetName(GetType(Recess), nValue) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_PRT_RECESS, sValue) Then m_BTLStructureM.m_SelRECESS = value Else NotifyPropertyChanged(NameOf(SelRECESS)) End If End Set End Property Public Property sUSERATTRIBUTE As String Get Return m_BTLStructureM.m_sUSERATTRIBUTE End Get Set(value As String) If EgtSetInfo(m_BTLStructureM.nBTLInfoId, BTL_GEN_USERATTRIBUTE, value) Then m_BTLStructureM.m_sUSERATTRIBUTE = value Else NotifyPropertyChanged(NameOf(sUSERATTRIBUTE)) End If End Set End Property Public ReadOnly Property sBTLTotParts As String Get Return m_BTLPartVMList.Sum(Function(x) x.nCNT + x.nADDED) End Get End Property Public ReadOnly Property sBTLTotVolume As String Get Dim dMMTotVolume As Double = m_BTLPartVMList.Sum(Function(x) x.dUnitVolume * (x.nCNT + x.nADDED)) Return If(EgtUiUnitsAreMM(), DoubleToString(dMMTotVolume / 1000000000, 3), DoubleToString(dMMTotVolume * (12 / ONEINCH), 3)) End Get End Property Public ReadOnly Property dBTLTotTime As Double Get Return m_BTLPartVMList.Sum(Function(x) x.nCALC_TIME * (x.nCNT + x.nADDED)) End Get End Property Public ReadOnly Property sBTLTotTime As String Get Return TimeSpan.FromSeconds(dBTLTotTime).ToString() End Get End Property Public ReadOnly Property sBTLDoneTime As String Get Return TimeSpan.FromSeconds(m_BTLPartVMList.Sum(Function(x) x.nCALC_TIME * x.nDONE)).ToString() End Get End Property Public ReadOnly Property sBTLRemainingTime As String Get Return TimeSpan.FromSeconds(dBTLTotTime - m_BTLPartVMList.Sum(Function(x) x.nCALC_TIME * x.nDONE)).ToString() End Get End Property Public ReadOnly Property sTotCNTParts As String Get Return m_BTLPartVMList.Sum(Function(x) x.nCNT) End Get End Property Public ReadOnly Property sTotADDEDParts As String Get Return m_BTLPartVMList.Sum(Function(x) x.nADDED) End Get End Property Public ReadOnly Property sTotINPRODParts As String Get Return m_BTLPartVMList.Sum(Function(x) x.nINPROD) End Get End Property Public ReadOnly Property sTotDONEParts As String Get Return m_BTLPartVMList.Sum(Function(x) x.nDONE) End Get End Property #End Region ' Parametri generici ' Definizione comandi Private m_cmdDeletePart As ICommand Private m_cmdData As ICommand Private m_cmdAddPart As ICommand Private m_cmdUpdateBTL As ICommand #Region "Messages" Public ReadOnly Property PDN_Msg As String Get Return EgtMsg(61809) End Get End Property Public ReadOnly Property AddPart_ToolTip As String Get Return EgtMsg(61906) End Get End Property Public ReadOnly Property Data_ToolTip As String Get Return EgtMsg(61898) End Get End Property Public ReadOnly Property UpdateBTL_ToolTip As String Get Return EgtMsg(61834) End Get End Property #End Region ' Messages #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New(BTLStructureM As BTLStructureM) m_BTLStructureM = BTLStructureM AddHandler m_BTLStructureM.BTLPartAdded, AddressOf OnBTLPartAdded AddHandler m_SelBTLParts.CollectionChanged, AddressOf SelBTLParts_CollectionChanged ' creo lista di BTLPartVM CreateBTLPartVMList() m_BTLPartVMList_View = CollectionViewSource.GetDefaultView(m_BTLPartVMList) m_GroupList_View = CollectionViewSource.GetDefaultView(m_GroupList) m_SubGroupList_View = CollectionViewSource.GetDefaultView(m_SubGroupList) m_SectionList_View = CollectionViewSource.GetDefaultView(m_SectionList) m_BTLPartVMList_View.Filter = AddressOf PartFilter m_GroupList_View.Filter = AddressOf GroupFilter m_SectionList_View.Filter = AddressOf SectionFilter m_BTLPartVMList_View.GroupDescriptions.Add(New PropertyGroupDescription(NameOf(BTLPartVM.nPROJ))) m_Calc_PartEnd.Interval = TimeSpan.FromMilliseconds(500) AddHandler m_Calc_PartEnd.Tick, AddressOf Calc_PartEnd_Tick m_Calc_PartEnd.Start() ' Aggiorno check DOALL NotifyPropertyChanged(NameOf(bDOALL)) If BTLStructureM.nAsseBaseId = GDB_ID.NULL Then Map.refShowBeamPanelVM.SetShowBuilding(False) End If If Not IsNothing(Map.refProdManagerVM.BTLDataWnd) Then Dim bValue As Boolean = False Dim bValueForced As Boolean = False For Each BTLPart As BTLPartVM In m_BTLPartVMList For Each GeneralParameter As ProjectParameters In Map.refProdManagerVM.BTLDataWnd.GeneralParametersList bValue = False bValueForced = False EgtGetInfo(m_BTLStructureM.nBTLInfoId, GeneralParameter.sNameNge & "_FORCED", bValue) EgtGetInfo(BTLPart.nPartId, GeneralParameter.sNameNge & "_FORCED", bValueForced) If bValueForced Then BTLPart.SetStrategyModify_Visibility(True) Next Next End If End Sub #End Region ' Constructor #Region "METHODS" Private Sub CreateBTLPartVMList() Dim all As List(Of BTLPartVM) = (From BTLPartM In m_BTLStructureM.GetBTLParts() Select New BTLPartVM(BTLPartM, m_BTLStructureM)).ToList() For Each BTLPartVM As BTLPartVM In all AddHandler BTLPartVM.PropertyChanged, AddressOf OnBTLPartVMPropertyChanged Next m_BTLPartVMList = New ObservableCollection(Of BTLPartVM)(all) AddHandler m_BTLPartVMList.CollectionChanged, AddressOf OnBTLPartVMListChanged End Sub Friend Sub LoadFilters() For Each BTLPartVM As BTLPartVM In m_BTLPartVMList ' verifico sezione, gruppo e sottogruppo per inserirli nei filtri If Not SectionList.Contains(BTLPartVM.Section) Then SectionList.Add(BTLPartVM.Section) End If If Not GroupList.Contains(BTLPartVM.sGROUP) Then GroupList.Add(BTLPartVM.sGROUP) End If If Not SubGroupList.Contains(BTLPartVM.sSTOREY) Then SubGroupList.Add(BTLPartVM.sSTOREY) End If Next End Sub Private Sub Calc_PartEnd_Tick() ' se calcolo non in corso (mainmenu e' attivo), esco If Map.refMainMenuVM.MainMenu_IsEnabled Then Return ' aggiorno iconcina delle feature dei part che hanno finito calcolo For Each BTLPart In BTLPartVMList If BTLPart.Calc_PartEnd Then BTLPart.BTLFeatureVMList_View.Refresh() BTLPart.ResetCalcPartEnd() End If Next End Sub Friend Sub SceneSelPartSelection() ' deseleziono tutto EgtDeselectAll() ' disabilito impostazione modificato Dim DisableMgr As New DisableModifiedMgr ' ciclo sui pezzi If (Keyboard.Modifiers And ModifierKeys.Shift) = ModifierKeys.Shift OrElse (Keyboard.Modifiers And ModifierKeys.Control) = ModifierKeys.Control Then EgtSetMode(Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId, GDB_MD.STD) Else For Each Part As BTLPartVM In m_BTLPartVMList ' se non è quello selezionato, lo nascondo If Part IsNot m_SelBTLPart Then EgtSetMode(Part.nPartId, GDB_MD.HIDDEN) Else EgtSetMode(Part.nPartId, GDB_MD.STD) End If Next End If ' ripristino precedente impostazione modificato DisableMgr.ReEnable() End Sub Friend Sub ShowAll(Optional bRedraw As Boolean = True, Optional bOnlySelected As Boolean = False) ' disabilito impostazione modificato Dim DisableMgr As New DisableModifiedMgr If Not IsNothing(SelBTLPart) Then ' se pezzo solido, lo riporto normale Configuration.DeselectSolid() ' tolgo pezzo selezionato SelBTLPart.SelBTLFeatureVM = Nothing End If ' mostro tutti i pezzi ' creo lista id presenti Dim BTLPartIdList As List(Of Integer) = (From Part In BTLPartVMList Select Part.nPartId).ToList() BTLPartIdList.Sort() Dim nGeomPartId As Integer = EgtGetFirstPart() While nGeomPartId <> GDB_ID.NULL Dim CurrPart As BTLPartVM = BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nGeomPartId) If Not IsNothing(CurrPart) AndAlso Not bOnlySelected Then Dim nMode As Integer EgtGetMode(CurrPart.nPartId, nMode) If nMode <> GDB_MD.STD Then EgtSetMode(CurrPart.nPartId, GDB_MD.STD) End If Else EgtSetMode(nGeomPartId, GDB_MD.HIDDEN) End If nGeomPartId = EgtGetNextPart(nGeomPartId) End While ' ripristino precedente impostazione modificato DisableMgr.ReEnable() Core.ViewPanelVM.BWSetView(VT.ISO_SW, False) EgtZoom(ZM.ALL, bRedraw) ' imposto stato per ShowBeamPanel If Not bOnlySelected Then Map.refShowBeamPanelVM.bShowAll = True End Sub Friend Sub HideAll(Optional bRedraw As Boolean = True) ' disabilito impostazione modificato Dim DisableMgr As New DisableModifiedMgr If Not IsNothing(SelBTLPart) Then ' se pezzo solido, lo riporto normale Configuration.DeselectSolid(GDB_ID.NULL, True) ' tolgo pezzo selezionato SelBTLPart.SelBTLFeatureVM = Nothing End If SetSelBTLPart(Nothing) ' nascondo tutti i pezzi Dim nPartId As Integer = EgtGetFirstPart() While nPartId <> GDB_ID.NULL Dim nMode As Integer EgtGetMode(nPartId, nMode) If nMode <> GDB_MD.HIDDEN Then EgtSetMode(nPartId, GDB_MD.HIDDEN) End If nPartId = EgtGetNextPart(nPartId) End While ' ripristino precedente impostazione modificato DisableMgr.ReEnable() Core.ViewPanelVM.BWSetView(VT.ISO_SW, False) EgtZoom(ZM.ALL, bRedraw) ' imposto stato per ShowBeamPanel Map.refShowBeamPanelVM.bShowAll = True End Sub Friend Sub ShowBuilding(nIdAsseBase As Integer, bShow As Boolean, Optional bRedraw As Boolean = True) ' disabilito impostazione modificato Dim DisableMgr As New DisableModifiedMgr Dim bOn As Boolean = EgtBeamGetBuildingIsOn(nIdAsseBase) If bShow <> bOn Then If bShow Then EgtBeamCalcAllSolids(True) EgtBeamShowBuilding(nIdAsseBase, bShow) If Not bShow Then EgtBeamShowAllSolids(False) End If ' ripristino precedente impostazione modificato DisableMgr.ReEnable() ' aggiorno visualizzazione Core.ViewPanelVM.BWSetView(VT.ISO_SW, False) EgtZoom(ZM.ALL, bRedraw) End Sub Friend Sub ShowSolid(nPartId As Integer, bShow As Boolean, Optional bRedraw As Boolean = True) ' se non viene passato, recupero il pezzo del primo oggetto selezionato If nPartId = GDB_ID.NULL And Not IsNothing(SelBTLPart) Then nPartId = SelBTLPart.nPartId End If If Not EgtIsPart(nPartId) Then Dim nLayerId As Integer = EgtGetParent(nPartId) Dim sLayerName As String = "" EgtGetName(nLayerId, sLayerName) If sLayerName <> ASSEBASE Then Map.refMyStatusBarVM.SetOutputMessage("ERROR: Nessuna trave selezionata ", 5, MSG_TYPE.ERROR_) Return End If End If EgtDeselectAll() ' disabilito impostazione modificato Dim DisableMgr As New DisableModifiedMgr If bShow Then EgtBeamCalcSolid(nPartId) EgtBeamShowSolid(nPartId, bShow) If bRedraw Then EgtDraw() ' ripristino precedente impostazione modificato DisableMgr.ReEnable() End Sub ' Funzione per regolarizzare, se necessario, la superficie della feature Private Function RegularizeTriMesh(SurfId As Integer, DestGrpId As Integer, dStep As Double) As Integer ' solo per superfici trimesh con poche facce (max4) Dim nFacetCnt As Integer = EgtSurfTmFacetCount(SurfId) If nFacetCnt > 4 Then Return SurfId End If ' box della superficie Dim b3Surf As New BBox3d EgtGetBBox(SurfId, GDB_BB.STANDARD, b3Surf) If b3Surf.IsEmpty() Or b3Surf.DimX() < 2 * dStep Then Return SurfId End If ' recupero le facce e le divido in X Dim dXmin As Double = b3Surf.Min().x - 1 Dim dXmax As Double = b3Surf.Max().x + 1 Dim nStep As Integer = CInt(Math.Floor((dXmax - dXmin) / dStep + 0.9)) dStep = (dXmax - dXmin) / nStep Dim NewSurfId As Integer = GDB_ID.NULL For nF = 0 To nFacetCnt - 1 Dim FacId As Integer = EgtCopySurfTmFacet(SurfId, nF, DestGrpId) Dim b3Fac As New BBox3d EgtGetBBox(FacId, GDB_BB.STANDARD, b3Fac) Dim dX2 As Double = dXmin For nI = 1 To nStep Dim dX1 As Double = dX2 dX2 = dX2 + dStep If b3Fac.Min().x < dX2 And b3Fac.Max().x > dX1 Then EgtCutSurfTmPlane(FacId, New Point3d(dX1, 0, 0), -Vector3d.X_AX, True) EgtCutSurfTmPlane(FacId, New Point3d(dX2, 0, 0), Vector3d.X_AX, False) Dim nCount As Integer = 0 Dim LoopId As Integer = EgtExtractSurfTmFacetLoops(FacId, 0, DestGrpId, nCount) EgtMergeCurvesInCurveCompo(LoopId, 0.001) Dim TmpSurfId As Integer = EgtCreateSurfTmByFlatContour(DestGrpId, LoopId, 0.01) EgtErase(LoopId) If NewSurfId <> GDB_ID.NULL Then NewSurfId = EgtCreateSurfTmBySewing(DestGrpId, 2, {NewSurfId, TmpSurfId}, True) Else NewSurfId = TmpSurfId End If EgtErase(FacId) FacId = EgtCopySurfTmFacet(SurfId, nF, DestGrpId) End If Next EgtErase(FacId) Next Return NewSurfId End Function Private Function PartFilter(Part As Object) As Boolean Dim CurrBTLPart As BTLPartVM = DirectCast(Part, BTLPartVM) Dim bGroupOk As Boolean = True Dim bSubGroupOk As Boolean = True Dim bSectionOk As Boolean = True Dim bSearchTextOk As Boolean = True If Not Map.refLeftPanelVM.IsFilterBtnOpen Then m_SelSearchParam.Id = 2 m_SelSearchParam.Name = "Descrizione" End If If SelSection <> SectionXMaterial.Empty AndAlso CurrBTLPart.Section <> SelSection Then bSectionOk = False If SelGroup <> "" AndAlso CurrBTLPart.sGROUP <> SelGroup Then bGroupOk = False If SelSubGroup <> "" AndAlso CurrBTLPart.sSTOREY <> SelSubGroup Then bSubGroupOk = False If m_SelSearchParam.Id <> BTLPartParam.NULL AndAlso m_SearchText <> String.Empty AndAlso ( (m_SelSearchParam.Id = BTLPartParam.PDN AndAlso CurrBTLPart.nPDN.ToString.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) < 0) OrElse (m_SelSearchParam.Id = BTLPartParam.NAM AndAlso CurrBTLPart.sNAM.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) < 0)) Then bSearchTextOk = False End If Dim bResult As Boolean = bSectionOk AndAlso bGroupOk AndAlso bSubGroupOk AndAlso bSearchTextOk ' If Not bResult And CurrBTLPart.IsSelected Then CurrBTLPart.IsSelected = False Return bResult End Function Private Function GroupFilter(Group As Object) As Boolean Dim CurrGroup As String = DirectCast(Group, String) Dim bOk As Boolean = True If CurrGroup <> "" AndAlso (SelSection <> SectionXMaterial.Empty OrElse SelSubGroup <> "" OrElse SearchText <> "") Then bOk = m_BTLPartVMList.Any(Function(x) x.sGROUP = CurrGroup AndAlso (SelSection = SectionXMaterial.Empty OrElse x.Section = SelSection) AndAlso (SelSubGroup = "" OrElse x.sSTOREY = SelSubGroup) AndAlso (SearchText = "" OrElse Not x.sNAM.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) >= 0)) End If Return bOk End Function Private Function SubGroupFilter(SubGroup As Object) As Boolean Dim CurrSubGroup As String = DirectCast(SubGroup, String) Dim bOk As Boolean = True If CurrSubGroup <> "" AndAlso (SelSection <> SectionXMaterial.Empty OrElse SearchText <> "" OrElse SelGroup <> "") Then bOk = m_BTLPartVMList.Any(Function(x) x.sGROUP = CurrSubGroup AndAlso (SelSection = SectionXMaterial.Empty OrElse x.Section = SelSection) AndAlso (SelGroup = "" OrElse x.sGROUP = SelGroup) AndAlso (SearchText = "" OrElse Not x.sNAM.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) >= 0)) End If Return bOk End Function Private Function SectionFilter(Section As Object) As Boolean Dim CurrSection As SectionXMaterial = DirectCast(Section, SectionXMaterial) Dim bOk As Boolean = True If CurrSection <> Section.Empty AndAlso (SelGroup <> "" OrElse SelSubGroup <> "" OrElse SearchText <> "") Then bOk = m_BTLPartVMList.Any(Function(x) x.Section = CurrSection AndAlso (SelGroup = "" OrElse x.sGROUP = SelGroup) AndAlso (SelSubGroup = "" OrElse x.sSTOREY = SelSubGroup) AndAlso (SearchText = "" OrElse Not x.sNAM.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) >= 0)) End If Return bOk End Function Friend Sub UpdateSection(NewPartSection As SectionXMaterial, OldPartSection As SectionXMaterial) Dim tmpSectionList As New List(Of SectionXMaterial) If IsNothing(BTLPartVMList) Then Return ' verifico se era unico con vecchia sezione If Not m_BTLPartVMList.Any(Function(x) x.Section = OldPartSection) Then ' nel caso seleziono filtro generico SelSection = m_SectionList(0) ' e poi lo cerco ed elimino m_SectionList.FirstOrDefault(Function(x) x = OldPartSection) m_SectionList.Remove(m_SectionList.FirstOrDefault(Function(x) x = OldPartSection)) End If ' verifico se esiste già nuova sezione If Not m_SectionList.Any(Function(x) x = NewPartSection) Then tmpSectionList.Add(NewPartSection) End If Application.Current.Dispatcher.Invoke(Sub() For Each SectionItem As SectionXMaterial In tmpSectionList m_SectionList.Add(SectionItem) Next End Sub) End Sub ' funzione che aggiorna totale tempi a fine calcolo Friend Sub CalcGlobalTime() NotifyPropertyChanged(NameOf(sBTLTotTime)) NotifyPropertyChanged(NameOf(sBTLDoneTime)) NotifyPropertyChanged(NameOf(sBTLRemainingTime)) End Sub ' funzione che aggiorna numero pezzi, volume e tempo totali Friend Sub CalcGlobalUpdate() NotifyPropertyChanged(NameOf(sBTLTotParts)) NotifyPropertyChanged(NameOf(sBTLTotVolume)) NotifyPropertyChanged(NameOf(sBTLTotTime)) NotifyPropertyChanged(NameOf(sBTLDoneTime)) NotifyPropertyChanged(NameOf(sBTLRemainingTime)) End Sub ' funzione utilizata per aggiornare rot e flip dopo calcolo Public Sub RefreshRotFlip() For Each BTLPart In BTLPartVMList If Not EgtGetInfo(BTLPart.nPartId, BTL_PRT_ROTATED, BTLPart.BTLPartM.nROTATED) Then BTLPart.BTLPartM.nROTATED = 0 End If If Not EgtGetInfo(BTLPart.nPartId, BTL_PRT_INVERTED, BTLPart.BTLPartM.nINVERTED) Then BTLPart.BTLPartM.nINVERTED = 0 End If BTLPart.NotifyPropertyChanged(NameOf(BTLPart.sROTATED)) BTLPart.NotifyPropertyChanged(NameOf(BTLPart.sINVERTED)) Next End Sub Private Sub ReloadBTLStructure() Map.refProjectVM.BTLStructureVM = New BTLStructureVM(BTLStructureM.CreateBTLStructure(0)) ' verifico se volume pezzi calcolato Dim bIsCalculated As Boolean = False For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLPartVMList If BTLPart.BTLPartM.dVolume > 0 Then Continue For bIsCalculated = True BTLPart.CalcBTLPartVolume() Next If bIsCalculated Then Dim CurrProject As String = "" EgtGetCurrFilePath(CurrProject) EgtSaveFile(CurrProject, NGE.CMPTEXT) End If End Sub #End Region ' Methods #Region "COMMANDS" #Region "DeletePart" Public ReadOnly Property DeletePart_Command As ICommand Get If m_cmdDeletePart Is Nothing Then m_cmdDeletePart = New Command(AddressOf DeletePart) End If Return m_cmdDeletePart End Get End Property Public Sub DeletePart() Map.refBTLPartManagerVM.RemovePartCmd() End Sub #End Region ' DeletePart #Region "Data" Public ReadOnly Property Data_Command As ICommand Get If m_cmdData Is Nothing Then m_cmdData = New Command(AddressOf Data) End If Return m_cmdData End Get End Property Friend Sub Data(nProjId As Integer) Dim BTLDataWnd As New BTLDataWndV(Application.Current.MainWindow, New BTLDataWndVM()) BTLDataWnd.ShowDialog() End Sub #End Region ' Data #Region "AddPart" 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 Public Sub AddPart(nProjId As Integer) ' 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, 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 ' 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 If Map.refProdManagerVM.ListProjAsseBase.Count > 0 Then Map.refProjectVM.UpdatePart(nNewPartId) End If End Sub #End Region ' AddPart #Region "UpdateBTL" Public ReadOnly Property UpdateBTL_Command As ICommand Get If m_cmdUpdateBTL Is Nothing Then m_cmdUpdateBTL = New Command(AddressOf UpdateBTL) End If Return m_cmdUpdateBTL End Get End Property Public Sub UpdateBTL(nProjId As Integer, Optional sFile As String = "", Optional bWithDlg As Boolean = True) If IsNothing(CurrProd) Then Return ' verifico se progetto modificato, e chiedo se salvare If CurrProd.bIsNew Or EgtGetModified() OrElse Map.refCALCPanelVM.IsMachineModified() Then Select Case EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(61877), "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) Case MessageBoxResult.Yes Map.refProdManagerVM.Save() Case MessageBoxResult.Cancel Return Case Else ' No EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(61892), "", MessageBoxButton.OK, MessageBoxImage.Exclamation) Return End Select End If ' se vista tutti i pezzi Dim bShowBuilding As Boolean = False Dim bShowSolid As Boolean = False Dim nSelPartId As Integer = GDB_ID.NULL If Map.refShowBeamPanelVM.bShowAll Then ' verifico se assemblato e lo annullo per salvataggio bShowBuilding = Map.refShowBeamPanelVM.ShowBuilding_IsChecked If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(False, False) ' se vista singolo pezzo Else bShowSolid = Map.refShowBeamPanelVM.ShowSolid_IsChecked If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, False, False) ' se pezzo selezionato lo segno e metto vista tutti If Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Not IsNothing(Map.refProjectVM.BTLStructureVM.SelBTLPart) Then nSelPartId = Map.refProjectVM.BTLStructureVM.SelBTLPart.nPartId End If Map.refProjectVM.BTLStructureVM.ShowAll(False) End If Dim sDir As String = String.Empty GetMainPrivateProfileString(S_GENERAL, K_LASTUPDATEDIR, "", sDir) If bWithDlg Then ' apro finestra scelta file Dim BTLDlg As New Microsoft.Win32.OpenFileDialog() With { .Title = EgtMsg(61834), .DefaultExt = ".btl", .Filter = "BTL (*.btl)|*.btl" & "|BTLX (*.btlx)|*.btlx", .InitialDirectory = If(Directory.Exists(sDir), sDir, ""), .CheckFileExists = True, .ValidateNames = True} If BTLDlg.ShowDialog() Then sFile = BTLDlg.FileName Else ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) Return End If End If ' salvo lista pezzi del progetto originale Dim OrigPartlist As ObservableCollection(Of BTLPartVM) = Map.refProjectVM.BTLStructureVM.BTLPartVMList ' creo un nuovo contesto su cui aprire il file BTL Dim nCurrCtx As Integer = EgtGetCurrentContext() Dim nTempCtx As Integer = EgtInitContext() ' setto il flag per inizializzazione gestore travi e pareti per importare progetto Dim nFlag As Integer Dim sBTLFlag As String If Map.refProdManagerVM.nProdType = BWType.BEAM Then sBTLFlag = K_BTLFLAG Else sBTLFlag = K_WALLBTLFLAG End If nFlag = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR) ' inizializzo gestore travi e pareti EgtInitBeamMgr(nFlag) Dim bOk As Boolean = nTempCtx <> 0 If bOk Then ' importo il file BTL bOk = bOk AndAlso EgtImportBtl(sFile, nFlag) ' carico la lista dei Part importati e rimuovo i parametri generali del BTL Dim AsseBaseId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) Dim BtlInfoId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, BTLINFO) Dim PartToUpdateList As New List(Of BTLPartToUpdate) ' cerco tra i layer BTLInfo While BtlInfoId <> GDB_ID.NULL ' verifico se il layer appartiene al ProjId Dim nBTLInfoLayerProjId As Integer EgtGetInfo(BtlInfoId, BTL_PRT_PROJ, nBTLInfoLayerProjId) ' carico la lista con i PDN dei pezzi del BTL importato Dim nPDN As Integer = 0 Dim sNAM As String = String.Empty Dim nUID As Integer = 0 Dim nPartId As Integer = EgtGetFirstPart() While nPartId <> GDB_ID.NULL Dim UIDList As New List(Of Integer) Dim nIndUID As Integer = 1 ' se devo filtrare un progetto If nBTLInfoLayerProjId > 0 Then ' verifico se il pezzo appartiene al ProjId Dim nPartProjId As Integer EgtGetInfo(nPartId, BTL_PRT_PROJ, nPartProjId) If nPartProjId = nBTLInfoLayerProjId Then EgtGetInfo(nPartId, BTL_PRT_PDN, nPDN) EgtGetInfo(nPartId, BTL_PRT_NAM, sNAM) While EgtGetInfo(nPartId, BTL_PRT_UID & nIndUID, nUID) UIDList.Add(nUID) nIndUID += 1 End While PartToUpdateList.Add(New BTLPartToUpdate(nPartId, nPDN, sNAM, UIDList, OrigPartlist.Any(Function(x) x.nPDN = nPDN))) End If Else ' altrimenti carico tutti EgtGetInfo(nPartId, BTL_PRT_PDN, nPDN) EgtGetInfo(nPartId, BTL_PRT_NAM, sNAM) While EgtGetInfo(nPartId, BTL_PRT_UID & nUID, nUID) UIDList.Add(nUID) nIndUID += 1 End While PartToUpdateList.Add(New BTLPartToUpdate(nPartId, nPDN, sNAM, UIDList, OrigPartlist.Any(Function(x) x.nPDN = nPDN))) End If nPartId = EgtGetNextPart(nPartId) End While EgtErase(BtlInfoId) BtlInfoId = EgtGetNextName(BtlInfoId, BTLINFO) End While ' costruisco un dizionario con gli id dei sottonodi di AsseBase del BTL importato e il valore dell'Info N degli stessi Dim AsseBaseSubNodeDict As New Dictionary(Of Integer, Integer) Dim nAsseBaseSubNodeId As Integer = EgtGetFirstInGroup(AsseBaseId) Dim sAsseBaseUID As String = String.Empty Dim nAsseBaseUID As Integer = 0 While nAsseBaseSubNodeId <> GDB_ID.NULL If EgtGetInfo(nAsseBaseSubNodeId, BTL_ASSEBASE_N, sAsseBaseUID) Then sAsseBaseUID = sAsseBaseUID.Remove(0, 4) Integer.TryParse(sAsseBaseUID, nAsseBaseUID) AsseBaseSubNodeDict.Add(nAsseBaseSubNodeId, sAsseBaseUID) End If nAsseBaseSubNodeId = EgtGetNext(nAsseBaseSubNodeId) End While ' salvo il file BTL da cui abbiamo rimosso BtlInfo come file NGE EgtSaveFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE, NGE.CMPTEXT) Dim bAppend As Boolean = False ' se UserLevel > 5 e fra i Part importati ce ne sta almeno 1 con PDN uguale ai Part già presenti ' apro la finestra per chiedere se si vuole aggiornare o accodare If Map.refMainWindowVM.MainWindowM.nUserLevel > 5 Then For Each PartToUpdate In PartToUpdateList Dim bExitFor As Boolean = False For Each BTLPart In Map.refProjectVM.BTLStructureVM.BTLStructureM.BTLPartMList If PartToUpdate.nPDN = BTLPart.nPDN Then Dim UpdateOrAppendWndVM As New UpdateOrAppendWndVM() Dim UpdateOrAppendWnd As New UpdateOrAppendWndV(Application.Current.MainWindow, UpdateOrAppendWndVM) If Not UpdateOrAppendWnd.ShowDialog() Then ' torno sul contesto corrente EgtSetCurrentContext(nCurrCtx) EgtDeleteContext(nTempCtx) ' rileggo la struttura BTL ReloadBTLStructure() ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then 'SelPart.IsSelected = True If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) Return End If ' salvo lo stato del bottone per accodare bAppend = UpdateOrAppendWndVM.AppendIsChecked bExitFor = True Exit For End If Next If bExitFor Then Exit For Next End If ' se selezionato Append li accodo tutti If bAppend Then ' torno sul contesto corrente EgtSetCurrentContext(nCurrCtx) EgtDeleteContext(nTempCtx) ' rileggo la struttura BTL del progetto corrente per non avere quella del contesto temporaneo ancora presente ReloadBTLStructure() ' salvo gli id degli AsseBase presenti nel progetto corrente Dim AsseBaseIdList As New List(Of Integer) AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While AsseBaseId <> GDB_ID.NULL AsseBaseIdList.Add(AsseBaseId) AsseBaseId = EgtGetNextName(AsseBaseId, ASSEBASE) End While ' calcolo BBox globale del progetto iniziale Dim b3Parts As New BBox3d Dim nProjPartId As Integer = EgtGetFirstPart() Dim nLastProjPartId As Integer = 0 While nProjPartId <> GDB_ID.NULL Dim b3Part As New BBox3d EgtGetBBoxGlob(nProjPartId, GDB_BB.ONLY_VISIBLE, b3Part) b3Parts.Add(b3Part) nLastProjPartId = nProjPartId nProjPartId = EgtGetNextPart(nProjPartId) End While ' inserisco il file importato nel progetto corrente bOk = bOk AndAlso EgtInsertFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE) ' deseleziono tutto EgtDeselectAll() ' ciclo sui pezzi aggiunti Dim nAddedPartId As Integer = EgtGetNextPart(nLastProjPartId) Dim bFirstLoop As Boolean = True Dim LastPartMaxY As Double Dim nIncrPDN As Integer = 0 While nAddedPartId <> GDB_ID.NULL ' incremento il PDN del Part aggiunto rispetto al PDN maggiore attualmente presente EgtSetInfo(nAddedPartId, BTL_PRT_PDN, Map.refProjectVM.BTLStructureVM.BTLStructureM.NewPDN() + nIncrPDN) ' recupero layer del box Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nAddedPartId, "Box") ' recupero box del layer box Dim b3Box As New BBox3d EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box) ' ricaviamo il box globale del part appena aggiunto Dim b3Part As New BBox3d EgtGetBBoxGlob(nAddedPartId, 1, b3Part) ' sposto il pezzo per distanziarlo dall'ultimo di un offset pari a 500 bOk = bOk AndAlso EgtMove(nAddedPartId, New Vector3d(0, If(bFirstLoop, b3Parts.Max.y, LastPartMaxY - b3Part.Min.y) + 500, 0)) bFirstLoop = False ' ricaviamo il box globale del part appena spostato, salviamo la sua Y massima e lo aggiungiamo al box globale di tutti i part EgtGetBBoxGlob(nAddedPartId, 1, b3Part) LastPartMaxY = b3Part.Max.y b3Parts.Add(b3Part) nAddedPartId = EgtGetNextPart(nAddedPartId) nIncrPDN += 1 End While ' aggiungo i part inseriti alla lista Dim nNewPartId As Integer = EgtGetNextPart(nLastProjPartId) While nNewPartId <> GDB_ID.NULL ' aggiungo dati pezzo Dim NewPart As BTLPartM = BTLPartM.CreateBTLPart(nNewPartId) ' aggiungo pezzo alla lista Map.refProjectVM.BTLStructureVM.BTLStructureM.AddBTLPart(NewPart) Dim AddedBTLPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.BTLPartM Is NewPart) ' verifico se aggiungere sezione alla lista If Not Map.refProjectVM.BTLStructureVM.SectionList.Contains(AddedBTLPart.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Add(AddedBTLPart.Section) End If nNewPartId = EgtGetNextPart(nNewPartId) End While ' elimino gli AsseBase del progetto importato AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While AsseBaseId <> GDB_ID.NULL Dim CurrAsseBaseId = AsseBaseId AsseBaseId = EgtGetNextName(AsseBaseId, ASSEBASE) If Not AsseBaseIdList.Contains(CurrAsseBaseId) Then EgtErase(CurrAsseBaseId) End While WriteMainPrivateProfileString(S_GENERAL, K_LASTUPDATEDIR, Path.GetDirectoryName(sFile)) Else ' altrimenti apro la finestra con l'elenco dei Part da checkare per l'inserimento nel progetto (unica strada se UserLevel <= 5), ' che prevederà la sovrascrittura di quelli già presenti e l'aggiunta di quelli nuovi Dim UpdateBTLWndVM As New UpdateBTLWndVM(PartToUpdateList) Dim UpdateBTLWnd As New UpdateBTLWndV(Application.Current.MainWindow, UpdateBTLWndVM) If Not UpdateBTLWnd.ShowDialog() Then ' torno sul contesto corrente EgtSetCurrentContext(nCurrCtx) EgtDeleteContext(nTempCtx) ' rileggo la struttura BTL ReloadBTLStructure() ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) Return End If If UpdateBTLWndVM.BTLPartList.Count > 0 Then ' sovrascrivo i Part nel progetto aperto con i Part checkati nella lista Dim BTLPartToOverwriteWithList As New ObservableCollection(Of BTLPartToUpdate) ' Elimino dal TempCtx i Part non checkati For Each BTLPartToOverwriteWith In UpdateBTLWndVM.BTLPartList If BTLPartToOverwriteWith.bInsert Then BTLPartToOverwriteWithList.Add(BTLPartToOverwriteWith) Else ' elimino pezzo copia Dim nCurrPartId = EgtGetCurrPart() EgtErase(BTLPartToOverwriteWith.nPartId) nCurrPartId = EgtGetCurrPart() End If Next ' costruisco un nuovo dizionario dei sottonodi di AsseBase contenente solo quelli corrispondenti agli UID contenuti ' nei soli Part checkati del BTL nella finestra UpdateBTLWnd Dim NewAsseBaseSubNodeDict As New Dictionary(Of Integer, Integer) For Each AsseBaseSubNodeItem In AsseBaseSubNodeDict For Each BTLPartToOverwriteWithItem In BTLPartToOverwriteWithList Dim bExitFor As Boolean = False For Each UIDItem In BTLPartToOverwriteWithItem.UIDList If AsseBaseSubNodeItem.Value = UIDItem Then NewAsseBaseSubNodeDict.Add(AsseBaseSubNodeItem.Key, AsseBaseSubNodeItem.Value) bExitFor = True Exit For End If Next If bExitFor Then Exit For Next Next ' confronto la lista appena costruita con quella originale ed elimino dal contesto i sottonodi con i valori non più presenti For Each AsseBaseSubNodeItem In AsseBaseSubNodeDict If Not NewAsseBaseSubNodeDict.ContainsValue(AsseBaseSubNodeItem.Value) Then EgtErase(AsseBaseSubNodeItem.Key) End If Next ' salvo il file NGE inserito a cui abbiamo rimosso i Part non checkati e gli AsseBase non più associati EgtSaveFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE, NGE.CMPTEXT) ' torno sul contesto corrente EgtDeleteContext(nTempCtx) EgtSetCurrentContext(nCurrCtx) ' aggiungo informazioni su pezzi Dim nPartId As Integer = EgtGetFirstPart(GDB_ID.ROOT) While nPartId <> GDB_ID.NULL ' scrivo in ogni pezzo ProjId EgtSetInfo(nPartId, BTL_PRT_PROJ, ProjectManagerVM.CurrProd.nProjId) ' scrivo Id negli outline Dim nPRId As Integer = 1 Dim nOutlineLayer As Integer = EgtGetFirstNameInGroup(nPartId, OUTLINE) If nOutlineLayer <> GDB_ID.NULL Then Dim nOutlineId As Integer = EgtGetFirstInGroup(nOutlineLayer) While nOutlineId <> GDB_ID.NULL ' verifico che sia feature If EgtExistsInfo(nOutlineId, MGR_FTR_PRC) Then EgtSetInfo(nOutlineId, MGR_FTR_PRID, nPRId) nPRId += 1 End If nOutlineId = EgtGetNext(nOutlineId) End While End If nPartId = EgtGetNextPart(nPartId) End While ' scrivo info proj e type su layer BtlInfo Dim nBTLInfoLayer As Integer = EgtGetLastNameInGroup(GDB_ID.ROOT, BTLINFO) EgtSetInfo(nBTLInfoLayer, BTL_PRT_PROJ, ProjectManagerVM.CurrProd.nProjId) EgtSetInfo(nBTLInfoLayer, BTL_GEN_PROJTYPE, nType) ' rileggo la struttura BTL del progetto corrente per non avere quella del contesto temporaneo ancora presente ReloadBTLStructure() ' elimino i pezzi da sovrascrivere nel progetto corrente For Each BTLPartToOverwriteWith In UpdateBTLWndVM.BTLPartList If BTLPartToOverwriteWith.bInsert Then Dim BTLPartToUpdate As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPDN = BTLPartToOverwriteWith.nPDN) ' se BTLPartToUpdate è Nothing significa che il pezzo è nuovo e quindi basta accodarlo senza eliminare nulla If Not IsNothing(BTLPartToUpdate) Then Dim nPartToDeleteId As Integer = BTLPartToUpdate.nPartId Dim nCurrPartId = EgtGetCurrPart() EgtErase(nPartToDeleteId) nCurrPartId = EgtGetCurrPart() ' verifico se rimuovere sezione dalla lista If Not Map.refProjectVM.BTLStructureVM.BTLPartVMList.Any(Function(x) x IsNot BTLPartToUpdate AndAlso x.Section = BTLPartToUpdate.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Remove(BTLPartToUpdate.Section) End If ' rimuovo dalla lista pezzi Dim Index As Integer = Map.refProjectVM.BTLStructureVM.BTLPartVMList.IndexOf(BTLPartToUpdate) Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Nothing) Map.refProjectVM.BTLStructureVM.BTLPartVMList.RemoveAt(Index) End If End If Next ' salvo gli id degli AsseBase presenti nel progetto corrente Dim AsseBaseIdList As New List(Of Integer) AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While AsseBaseId <> GDB_ID.NULL AsseBaseIdList.Add(AsseBaseId) ' elimino i sottonodi di AsseBase da sovrascrivere AsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) nAsseBaseSubNodeId = EgtGetFirstInGroup(AsseBaseId) 'While nAsseBaseSubNodeId <> GDB_ID.NULL ' If NewAsseBaseSubNodeDict.ContainsKey(nAsseBaseSubNodeId) Then ' ' se sottonodo da cancellare salvo il suo id e ricavo il seguente prima di cancellarlo ' Dim nCurrAsseBaseSubNodeId = nAsseBaseSubNodeId ' nAsseBaseSubNodeId = EgtGetNext(nCurrAsseBaseSubNodeId) ' bOk = EgtErase(nCurrAsseBaseSubNodeId) ' Else ' ' altrimenti ricavo il seguente e basta ' nAsseBaseSubNodeId = EgtGetNext(nAsseBaseSubNodeId) ' End If 'End While AsseBaseId = EgtGetNextName(AsseBaseId, ASSEBASE) End While ' calcolo BBox globale del progetto corrente Dim b3Parts As New BBox3d Dim nProjPartId As Integer = EgtGetFirstPart() Dim nLastProjPartId As Integer = GDB_ID.NULL While nProjPartId <> GDB_ID.NULL Dim b3Part As New BBox3d If EgtGetBBoxGlob(nProjPartId, GDB_BB.ONLY_VISIBLE, b3Part) Then b3Parts.Add(b3Part) End If nLastProjPartId = nProjPartId nProjPartId = EgtGetNextPart(nProjPartId) End While ' se sovrascrivo tutti e bbox esce nullo If b3Parts.IsEmpty Then b3Parts = New BBox3d(Point3d.ORIG) End If ' inserisco il file NGE (ricavato dal BTL importato) nel progetto corrente bOk = bOk AndAlso EgtInsertFile(Map.refMainWindowVM.MainWindowM.sTempDir & "\" & UPDATEBTL_NGE) ' ciclo su tutti gli AsseBase del progetto corrente Dim nAsseBaseId = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While nAsseBaseId <> GDB_ID.NULL Dim nAsseBaseProjId As Integer Dim nAsseBaseToEraseId As Integer = 0 EgtGetInfo(nAsseBaseId, BTL_PRT_PROJ, nAsseBaseProjId) ' se AsseBase di questo step del ciclo è nuovo e suo ProjId uguale a quello del progetto corrente If Not AsseBaseIdList.Contains(nAsseBaseId) AndAlso nAsseBaseProjId = CurrProd.nProdId Then ' riloco i sottonodi del nuovo AsseBase nell'AsseBase del progetto aperto col medesimo ProjId Dim AsseBaseSubNodeId As Integer = EgtGetFirstInGroup(nAsseBaseId) While AsseBaseSubNodeId <> GDB_ID.NULL ' ciclo su tutti gli AsseBase per trovare l'id di quello con ProjId uguale al progetto corrente Dim FindAsseBaseId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, ASSEBASE) While FindAsseBaseId <> GDB_ID.NULL Dim SameAsseBaseProjId As Integer EgtGetInfo(FindAsseBaseId, BTL_PRT_PROJ, SameAsseBaseProjId) ' se l'ho trovato esco dal While (FindAsseBaseId è l'id dell'AsseBase in cui vogliamo rilocare i sottonodi) If SameAsseBaseProjId = CurrProd.nProdId Then Exit While FindAsseBaseId = EgtGetNextName(FindAsseBaseId, ASSEBASE) End While ' salvo id dell'AsseBase corrente per ottenere il seguente prima di rilocarlo Dim CurrAsseBaseSubNodeId = AsseBaseSubNodeId AsseBaseSubNodeId = EgtGetNext(CurrAsseBaseSubNodeId) bOk = bOk AndAlso EgtRelocate(CurrAsseBaseSubNodeId, FindAsseBaseId, GDB_POS.LAST_SON) End While ' salvo id dell'AsseBase per cancellarlo nAsseBaseToEraseId = nAsseBaseId End If ' ricavo id del prossimo AsseBase nAsseBaseId = EgtGetNextName(nAsseBaseId, ASSEBASE) ' se salvato id dell'AsseBase per cancellarlo lo cancello If nAsseBaseToEraseId <> 0 Then bOk = bOk AndAlso EgtErase(nAsseBaseToEraseId) End While ' deseleziono tutto EgtDeselectAll() ' ciclo sui pezzi aggiunti Dim nAddedPartId As Integer = If(nLastProjPartId <> GDB_ID.NULL, EgtGetNextPart(nLastProjPartId), EgtGetFirstPart()) Dim LastPartMaxY As Double While nAddedPartId <> GDB_ID.NULL ' recupero layer del box Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nAddedPartId, "Box") ' recupero box del layer box Dim b3Box As New BBox3d EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box) ' ricaviamo il box globale del part appena aggiunto e ruotato Dim b3Part As New BBox3d EgtGetBBoxGlob(nAddedPartId, 1, b3Part) ' salviamo la Y massima del box globale di tutti i part LastPartMaxY = b3Parts.Max.y ' sposto il pezzo per distanziarlo dall'ultimo di un offset pari a 500 bOk = bOk AndAlso EgtMove(nAddedPartId, New Vector3d(0, LastPartMaxY - b3Part.Min.y + 500, 0)) ' ricaviamo il box globale del part appena spostato e lo aggiungiamo al box globale di tutti i part EgtGetBBoxGlob(nAddedPartId, 1, b3Part) b3Parts.Add(b3Part) ' aggiungo dati pezzo Dim NewPart As BTLPartM = BTLPartM.CreateBTLPart(nAddedPartId) ' aggiungo pezzo alla lista Map.refProjectVM.BTLStructureVM.BTLStructureM.AddBTLPart(NewPart) Dim AddedBTLPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.BTLPartM Is NewPart) ' 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 AddedBTLPart.Rotation(True, Map.refProjectVM.BTLStructureVM.nPROJTYPE, True, 180, False) End If ' verifico se aggiungere sezione alla lista If Not Map.refProjectVM.BTLStructureVM.SectionList.Contains(AddedBTLPart.Section) Then Map.refProjectVM.BTLStructureVM.SectionList.Add(AddedBTLPart.Section) End If nAddedPartId = EgtGetNextPart(nAddedPartId) End While WriteMainPrivateProfileString(S_GENERAL, K_LASTUPDATEDIR, Path.GetDirectoryName(sFile)) End If End If Map.refProdManagerVM.CopyBuilding() ' copio il file originale scelto nel dialog per l'Update nella cartella Proj del progetto corrente If File.Exists(sFile) Then 'Dim sDestPath As String = ProjectManagerVM.CurrProj.sProjDirPath & "\" & Path.GetFileNameWithoutExtension(sFile) Dim sDestPath As String = CurrProd.sProdDirPath & "\Projs\" & ProjectManagerVM.CurrProd.nProjIdList(0).ToString("0000") & "\" & Path.GetFileNameWithoutExtension(sFile) While File.Exists(sDestPath & ".btl") sDestPath &= "_1" End While File.Copy(sFile, sDestPath & ".btl", False) End If End If ' se assemblato lo ripristino If bShowBuilding Then Map.refProjectVM.BTLStructureVM.ShowBuilding(True, False) If nSelPartId <> GDB_ID.NULL Then Dim SelPart As BTLPartVM = Map.refProjectVM.BTLStructureVM.BTLPartVMList.FirstOrDefault(Function(x) x.nPartId = nSelPartId) If Not IsNothing(SelPart) Then If bShowSolid Then Map.refProjectVM.BTLStructureVM.ShowSolid(GDB_ID.NULL, True, False) End If End If EgtZoom(ZM.ALL) End Sub #End Region ' UpdateBTL #End Region ' Commands #Region "EVENTS" Private Sub OnBTLPartAdded(sender As Object, e As BTLPartAddedEventArgs) Dim BTLPartVM As BTLPartVM = New BTLPartVM(e.NewBTLPart, m_BTLStructureM) m_BTLPartVMList.Add(BTLPartVM) NotifyPropertyChanged(NameOf(BTLPartVMList)) End Sub Private Sub OnBTLPartVMListChanged(sender As Object, e As NotifyCollectionChangedEventArgs) If Not IsNothing(e.NewItems) AndAlso e.NewItems.Count > 0 Then For Each BTLPartVM As BTLPartVM In e.NewItems AddHandler BTLPartVM.PropertyChanged, AddressOf OnBTLPartVMPropertyChanged Next End If If Not IsNothing(e.OldItems) AndAlso e.OldItems.Count > 0 Then For Each BTLPartVM As BTLPartVM In e.OldItems RemoveHandler BTLPartVM.PropertyChanged, AddressOf OnBTLPartVMPropertyChanged m_BTLStructureM.BTLPartMList.Remove(BTLPartVM.BTLPartM) Next End If End Sub Private Sub OnBTLPartVMPropertyChanged(sender As Object, e As PropertyChangedEventArgs) Select Case "bDO" Case NameOf(sender.sMATERIAL) If Not GroupList.Contains(sender.sMATERIAL) Then GroupList.Add(sender.sMATERIAL) End If Case NameOf(sender.sW), NameOf(sender.sH), NameOf(sender.sL) Case NameOf(sender.nDONE) NotifyPropertyChanged(NameOf(sBTLDoneTime)) NotifyPropertyChanged(NameOf(sBTLRemainingTime)) Case NameOf(sender.bDO), NameOf(sender.sPriority) NotifyPropertyChanged(NameOf(bDOALL)) End Select End Sub #End Region ' Events End Class