Imports System.Collections.ObjectModel Imports EgtUILib Imports EgtWPFLib5 Public Class SplitModeVM Inherits VMBase #Region "FIELDS & PROPERTIES" ' Stato Private m_nCurrPhase As Integer = 0 Private m_MachiningList As New List(Of SplitMach) Private m_bModified As Boolean = False Private m_nNbrGrpId As Integer = GDB_ID.NULL Private m_CurrFirstInd As Integer = -1 Private m_CurrLastInd As Integer = -1 Private m_SelectedItemsList As New ObservableCollection(Of NameIdLsBxItem) ' numero di lavorazioni di tipo lama Private m_nCountSawing As Integer = 0 ' numero di lavprazioni di tipo waterjet Private m_nCountWaterjetting As Integer = 0 ' altri tipi di lavorazioni (Foro/Fresa) Private m_nCountOtherMachining As Integer = 0 ' verifico che le lavorazioni selezionate siano omogenee (con lo stesso utensile) Private m_bAreHomogeneous As Boolean = False ' Flag di pagina attiva Private m_bActive As Boolean = False ' Drag Private m_nDragInd As Integer = -1 Private m_nDragType As Integer = 0 '0=niente, 1=attacco, 2=uscita Private m_ptDragPrev As Point3d Private m_bDragging As Boolean = False ' Selected cut Private m_nSelected As Integer = GDB_ID.NULL Private m_ItemList As New ObservableCollection(Of NameIdLsBxItem) Public ReadOnly Property ItemList As ObservableCollection(Of NameIdLsBxItem) Get Return m_ItemList End Get End Property Private m_bEnabledCommandMove As Boolean = False Public Property bEnabledCommandMove As Boolean Get Return m_bEnabledCommandMove End Get Set(value As Boolean) m_bEnabledCommandMove = value NotifyPropertyChanged("bEnabledCommandMove") End Set End Property Private m_SplitModeIsEnabled As Boolean Public Property SplitModeIsEnabled As Boolean Get Return m_SplitModeIsEnabled End Get Set(value As Boolean) m_SplitModeIsEnabled = value NotifyPropertyChanged("SplitModeIsEnabled") End Set End Property Private m_AllExtRedVisibility As Visibility Public Property AllExtRedVisibility As Visibility Get Return m_AllExtRedVisibility End Get Set(value As Visibility) m_AllExtRedVisibility = value NotifyPropertyChanged("AllExtRedVisibility") End Set End Property Private m_CutBtnVisibility As Visibility Public Property CutBtnVisibility As Visibility Get Return m_CutBtnVisibility End Get Set(value As Visibility) m_CutBtnVisibility = value NotifyPropertyChanged(NameOf(CutBtnVisibility)) End Set End Property Private m_CutStartBtnVisibility As Visibility Public Property CutStartBtnVisibility As Visibility Get Return m_CutStartBtnVisibility End Get Set(value As Visibility) m_CutStartBtnVisibility = value NotifyPropertyChanged(NameOf(CutStartBtnVisibility)) End Set End Property Private m_CutEndBtnVisibility As Visibility Public Property CutEndBtnVisibility As Visibility Get Return m_CutEndBtnVisibility End Get Set(value As Visibility) m_CutEndBtnVisibility = value NotifyPropertyChanged(NameOf(CutEndBtnVisibility)) End Set End Property Private m_OutCenStartBtnVisibility As Visibility Public Property OutCenStartBtnVisibility As Visibility Get Return m_OutCenStartBtnVisibility End Get Set(value As Visibility) m_OutCenStartBtnVisibility = value NotifyPropertyChanged(NameOf(OutCenStartBtnVisibility)) End Set End Property Private m_OutCenEndBtnVisibility As Visibility Public Property OutCenEndBtnVisibility As Visibility Get Return m_OutCenEndBtnVisibility End Get Set(value As Visibility) m_OutCenEndBtnVisibility = value NotifyPropertyChanged(NameOf(OutCenEndBtnVisibility)) End Set End Property Private m_InvertBtnVisibility As Visibility Public Property InvertBtnVisibility As Visibility Get Return m_InvertBtnVisibility End Get Set(value As Visibility) m_InvertBtnVisibility = value NotifyPropertyChanged(NameOf(InvertBtnVisibility)) End Set End Property Private m_PauseBtnVisibility As Visibility Public Property PauseBtnVisibility As Visibility Get Return m_PauseBtnVisibility End Get Set(value As Visibility) m_PauseBtnVisibility = value NotifyPropertyChanged(NameOf(PauseBtnVisibility)) End Set End Property Private m_AllOutStartBtnVisibility As Visibility Public Property AllOutStartBtnVisibility As Visibility Get Return m_AllOutStartBtnVisibility End Get Set(value As Visibility) m_AllOutStartBtnVisibility = value NotifyPropertyChanged(NameOf(AllOutStartBtnVisibility)) End Set End Property Private m_AllCenStartBtnVisibility As Visibility Public Property AllCenStartBtnVisibility As Visibility Get Return m_AllCenStartBtnVisibility End Get Set(value As Visibility) m_AllCenStartBtnVisibility = value NotifyPropertyChanged(NameOf(AllCenStartBtnVisibility)) End Set End Property Private m_AllOutEndBtnVisibility As Visibility Public Property AllOutEndBtnVisibility As Visibility Get Return m_AllOutEndBtnVisibility End Get Set(value As Visibility) m_AllOutEndBtnVisibility = value NotifyPropertyChanged(NameOf(AllOutEndBtnVisibility)) End Set End Property Private m_AllCenEndBtnVisibility As Visibility Public Property AllCenEndBtnVisibility As Visibility Get Return m_AllCenEndBtnVisibility End Get Set(value As Visibility) m_AllCenEndBtnVisibility = value NotifyPropertyChanged(NameOf(AllCenEndBtnVisibility)) End Set End Property Private m_AllExtendBtnVisibility As Visibility Public Property AllExtendBtnVisibility As Visibility Get Return m_AllExtendBtnVisibility End Get Set(value As Visibility) m_AllExtendBtnVisibility = value NotifyPropertyChanged(NameOf(AllExtendBtnVisibility)) End Set End Property Private m_AllReduceBtnVisibility As Visibility Public Property AllReduceBtnVisibility As Visibility Get Return m_AllReduceBtnVisibility End Get Set(value As Visibility) m_AllReduceBtnVisibility = value NotifyPropertyChanged(NameOf(AllReduceBtnVisibility)) End Set End Property #Region "Messages" Public ReadOnly Property OnOffMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 1) End Get End Property Public ReadOnly Property AllOnMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 2) End Get End Property Public ReadOnly Property AllOffMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 3) End Get End Property Public ReadOnly Property CutMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 4) End Get End Property Public ReadOnly Property CutStartMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 5) End Get End Property Public ReadOnly Property CutEndMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 6) End Get End Property Public ReadOnly Property OutCenStartMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 7) End Get End Property Public ReadOnly Property AllOutStartMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 8) End Get End Property Public ReadOnly Property AllCenStartMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 9) End Get End Property Public ReadOnly Property OutCenEndMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 12) End Get End Property Public ReadOnly Property AllOutEndMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 13) End Get End Property Public ReadOnly Property AllCenEndMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 14) End Get End Property Public ReadOnly Property AllExtendMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 15) End Get End Property Public ReadOnly Property AllReduceMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 16) End Get End Property Public ReadOnly Property ModifStartMsg As String Get Return EgtMsg( 90373) ' Inizio Modif. End Get End Property Public ReadOnly Property ModifEndMsg As String Get Return EgtMsg( 90374) ' Fine Modif. End Get End Property Public ReadOnly Property PauseMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 31) End Get End Property Public ReadOnly Property InvertMsg As String Get Return EgtMsg(MSG_SPLITPAGEUC + 36) End Get End Property #End Region ' Messages ' Definizione comandi Private m_cmdMoveUp As ICommand Private m_cmdMoveDown As ICommand Private m_cmdOnOff As ICommand Private m_cmdAllOn As ICommand Private m_cmdAllOff As ICommand Private m_cmdCut As ICommand Private m_cmdCutStart As ICommand Private m_cmdCutEnd As ICommand Private m_cmdOutCenStart As ICommand Private m_cmdAllOutStart As ICommand Private m_cmdAllCenStart As ICommand Private m_cmdOutCenEnd As ICommand Private m_cmdAllOutEnd As ICommand Private m_cmdAllCenEnd As ICommand Private m_cmdAllExtend As ICommand Private m_cmdAllReduce As ICommand Private m_cmdModifStart As ICommand Private m_cmdModifEnd As ICommand Private m_cmdPause As ICommand Private m_cmdInvert As ICommand #End Region ' FIELDS & PROPERTIES #Region "CONSTRUCTOR" Sub New() ' Creo riferimento a questa classe in OmagOFFICEMap OmagOFFICEMap.SetRefSplitModeVM(Me) End Sub #End Region ' CONSTRUCTOR #Region "METHODS" Friend Function InitSplitRaw() As Boolean m_bActive = True 'm_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC m_nDragInd = -1 m_nDragType = 0 ' Nascondo eventuali pezzi in parcheggio EstCalc.HideParkedParts() ' Nascondo eventuale contorno da foto EstPhoto.ShowContour(False) ' Deseleziono pezzi EgtDeselectAll() VeinMatching.OnDeselectAll() EgtZoom(ZM.ALL) ' Elimino eventuali pretagli su uscite CamAuto.RemoveAllExitPreCuts() ' Se non sono in sola visualizzazione, faccio ordine automatico delle lavorazioni If Not OmagOFFICEMap.refMachiningTabVM.IsShow Then If CurrentMachine.WaterJettingActive Then ResetAllMachinings() If SortAllMachinings() Then EstCalc.SetOrderMachiningFlag() If CurrentMachine.WaterJettingActive Then Dim bModif As Boolean = TestAllMachiningsForStrict() If bModif Then OmagOFFICEMap.refStatusBarVM.SetOutputMessage(EgtMsg(90321), 3, MSG_TYPE.WARNING) 'Ridotte alcune lavorazioni per evitare interferenze End If End If ' Disabilito impostazione modificato EgtDisableModified() ' Creo gruppo per numeri identificativi di lavorazione (colore default grigio) m_nNbrGrpId = EgtCreateGroup(GDB_ID.ROOT) EgtSetColor(m_nNbrGrpId, COL_MCH_DIS_NUMBER) EgtSetStatus(m_nNbrGrpId, GDB_ST.SEL) EgtSetLevel(m_nNbrGrpId, GDB_LV.TEMP) ' Recupero l'indice della fase corrente m_nCurrPhase = EgtGetCurrPhase() ' Visualizzo solo anteprime di lavorazioni della fase ShowOnePhaseMachiningPreview(m_nCurrPhase) ' Preparo la lista delle lavorazioni CalculateSplitMachList(m_nCurrPhase, m_MachiningList) ' azzero i contatori delle lavorazioni m_nCountSawing = 0 m_nCountWaterjetting = 0 m_nCountOtherMachining = 0 ' Aggiorno visualizzazione delle lavorazioni For nI As Integer = 0 To m_MachiningList.Count() - 1 ' sistemo colore ColorMachining(m_MachiningList(nI)) ' assegno numerazione NumberDirectionMachining(nI) ' conto il numero di tipi di lavorazioni CountMachiningType(m_MachiningList(nI), m_nCountSawing, m_nCountWaterjetting, m_nCountOtherMachining) Next ' Preparo la lista degli Item ShowMachiningList() ' Aggiorno visualizzazione EgtDraw() ' Abilito impostazione modificato EgtEnableModified() ' Nessun item corrente m_CurrFirstInd = -1 m_CurrLastInd = -1 ' Reset flag di modifica m_bModified = False ' Abilitazione bottoni EnableButtons() Return True End Function Friend Function ExitSplitRaw(Optional bTrueExit As Boolean = True) As Boolean m_bActive = False ' Rimuovo evidenziazione e numeri RemoveMarkAndNumbers() ' Ripristino colori lavorazioni EgtDisableModified() For i As Integer = 0 To m_MachiningList.Count() - 1 ColorMachining(m_MachiningList(i), True) Next EgtEnableModified() ' Pulisco la lista che tiene conto delle lavorazioni selezionate m_SelectedItemsList.Clear() ' se modificato salvo ordine e stato delle lavorazioni If m_bModified Then ' Al primo posto deve rimanere la disposizione della fase Dim nFirstOperId As Integer = EgtGetPhaseDisposition(m_nCurrPhase) For i = m_ItemList.Count() - 1 To 0 Step -1 Dim nI As Integer = m_ItemList(i).Ind Dim nMchId As Integer = m_MachiningList(nI).m_nId EgtRelocate(nMchId, nFirstOperId, GDB_POS.AFTER) If m_MachiningList(nI).m_bEnabled Then EgtSetOperationMode(m_MachiningList(nI).m_nId, True) EgtRemoveInfo(m_MachiningList(nI).m_nId, INFO_MCH_USER_OFF) Else EgtSetOperationMode(m_MachiningList(nI).m_nId, False) EgtSetInfo(m_MachiningList(nI).m_nId, INFO_MCH_USER_OFF, True) End If Next ' dichiaro ordine salvato EstCalc.SetOrderMachiningFlag() End If ' Affondamento ridotto Dim dReducedDepth As Double = GetMainPrivateProfileDouble(S_MACH_NEST, K_MACH_REDUCEDDEPTH, 1) ' Restringo o rialzo lavorazioni abilitate ma con interferenza Dim bModified As Boolean = False For Each Mach As SplitMach In m_MachiningList If Mach.m_bEnabled And Mach.m_nInterf <> FMI_TYPE.NONE Then If AdjustMachining(Mach.m_nId, Mach.m_nInterf, dReducedDepth) Then bModified = True End If End If Next If bTrueExit Then ' ritorno a fase 1 EgtSetCurrPhase(1) ' Ripristino visualizzazione preview lavorazioni ShowAllPhasesMachiningPreview() End If If bModified Then ' Ridotte alcune lavorazioni per evitare interferenze OmagOFFICEMap.refStatusBarVM.SetOutputMessage(EgtMsg(90321), 3, MSG_TYPE.WARNING) End If Return True End Function Private Sub AddPauseText(ByRef sName As String) sName &= " " & EgtMsg(MSG_SPLITPAGEUC + 32) ' Pausa End Sub Private Sub AddTopText(ByRef sName As String) sName &= " Top" End Sub Private Sub RemovePauseText(ByRef sName As String) sName = sName.Replace(EgtMsg(MSG_SPLITPAGEUC + 32), "") sName = sName.TrimEnd() End Sub Friend Function GetDisabledCutsCount() As Integer ' Determino il numero di tagli disabilitati Dim nCount As Integer = 0 For nI As Integer = 0 To m_MachiningList.Count() - 1 If Not m_MachiningList(nI).m_bEnabled Then nCount += 1 End If Next Return nCount End Function Friend Function GetSplitCutsCount() As Integer ' Determino il numero di tagli passanti almeno da un lato Dim nCount As Integer = 0 For nI As Integer = 0 To m_MachiningList.Count() - 1 If m_MachiningList(nI).m_bEnabled And (m_MachiningList(nI).m_bStartAll Or m_MachiningList(nI).m_bEndAll) Then nCount += 1 End If Next Return nCount End Function Friend Sub GetSplitCuts(ByRef Cuts() As Integer) ' Determino l'elenco dei tagli passanti almeno da un lato Dim MyCuts As New List(Of Integer) For nI As Integer = 0 To m_MachiningList.Count() - 1 If m_MachiningList(nI).m_bEnabled And (m_MachiningList(nI).m_bStartAll Or m_MachiningList(nI).m_bEndAll) Then MyCuts.Add(m_MachiningList(nI).m_nId) End If Next Cuts = MyCuts.ToArray() End Sub Friend Sub GetEnabledCuts(ByRef Cuts() As Integer) ' Determino l'elenco dei tagli abilitati Dim MyCuts As New List(Of Integer) For nI As Integer = 0 To m_MachiningList.Count() - 1 If m_MachiningList(nI).m_bEnabled Then MyCuts.Add(m_MachiningList(nI).m_nId) End If Next Cuts = MyCuts.ToArray() End Sub Friend Sub ExecAuto() ' Con movimento manuale, non disponibile movimento automatico If OmagOFFICEMap.refMachiningTabVM.ByHand Then Return ' Elimino evidenziazione e numerazione RemoveMarkAndNumbers() ' Calcolo automatico Dim bFinished As Boolean = False Dim bOk As Boolean = SplitAuto.CalculateOnePhaseSplitAuto(bFinished) If Not bOk Then ' Calcolo automatico non riuscito OmagOFFICEMap.refStatusBarVM.SetOutputMessage(EgtMsg(90350), 3, MSG_TYPE.WARNING) End If m_bModified = True End Sub Friend Sub ChangeToModify() ' Elimino le fasi successive alla corrente While EgtGetPhaseCount() > m_nCurrPhase RemoveLastPhase() End While ' Aggiorno le lavorazioni (eliminato sort per lasciare ordine immutato) If CurrentMachine.WaterJettingActive Then ResetAllMachinings() EstCalc.SetOrderMachiningFlag() If CurrentMachine.WaterJettingActive Then Dim bModif As Boolean = TestAllMachiningsForStrict() If bModif Then OmagOFFICEMap.refStatusBarVM.SetOutputMessage(EgtMsg(90321), 3, MSG_TYPE.WARNING) 'Ridotte alcune lavorazioni per evitare interferenze End If ' Visualizzo solo anteprime di lavorazioni della fase ShowOnePhaseMachiningPreview(m_nCurrPhase) ' Nascondo gli eventuali percorsi di lavorazione HideAllMachinings() ' Preparo la lista delle lavorazioni e le disabilito CalculateSplitMachList(m_nCurrPhase, m_MachiningList) ' azzero i contatori delle lavorazioni m_nCountSawing = 0 m_nCountWaterjetting = 0 m_nCountOtherMachining = 0 For nI As Integer = 0 To m_MachiningList.Count() - 1 m_MachiningList(nI).m_bEnabled = False ' conto il numero di tipi di lavorazioni CountMachiningType(m_MachiningList(nI), m_nCountSawing, m_nCountWaterjetting, m_nCountOtherMachining) Next ' Aggiorno visualizzazione delle lavorazioni EgtEmptyGroup(m_nNbrGrpId) For nI As Integer = 0 To m_MachiningList.Count() - 1 ' sistemo colore ColorMachining(m_MachiningList(nI)) ' assegno numerazione NumberDirectionMachining(nI) Next ' Preparo la lista degli Item ShowMachiningList() ' Aggiorno visualizzazione EgtDraw() ' Aggiono abilitazione bottoni EnableButtons() End Sub Private Sub ShowMachiningList() m_ItemList.Clear() For i As Integer = 1 To m_MachiningList.Count() Dim Mach As SplitMach = m_MachiningList(i - 1) If Mach.m_nType = MCH_OY.SAWING Then ' Taglio Dim sText As String = String.Empty If Math.Abs(Mach.m_dSideAng) < EPS_ANG_SMALL Then sText = EgtMsg(90791) & " " & i.ToString() If Mach.m_sLay = NAME_ONPATH Then AddTopText(sText) Else sText = EgtMsg(90791) & " " & i.ToString() & " " & DoubleToString(Mach.m_dSideAng, 2) & "°" End If If Mach.m_bPause Then AddPauseText(sText) m_ItemList.Add(New NameIdLsBxItem(sText, i - 1, Mach.m_bEnabled, MCH_OY.SAWING)) ElseIf Mach.m_nType = MCH_OY.DRILLING Then ' Foratura Dim sText As String = EgtMsg(90792) & " " & i.ToString() If Mach.m_bPause Then AddPauseText(sText) m_ItemList.Add(New NameIdLsBxItem(sText, i - 1, Mach.m_bEnabled, MCH_OY.DRILLING)) ElseIf Mach.m_nType = MCH_OY.MILLING Then ' Fresatura Dim sText As String = EgtMsg(90793) & " " & i.ToString() If Mach.m_sLay = NAME_ONPATH Then AddTopText(sText) m_ItemList.Add(New NameIdLsBxItem(sText, i - 1, Mach.m_bEnabled, MCH_OY.MILLING)) ElseIf Mach.m_nType = MCH_OY.POCKETING Then ' Svuotatura Dim sText As String = EgtMsg(90796) & " " & i.ToString() If Mach.m_bPause Then AddPauseText(sText) m_ItemList.Add(New NameIdLsBxItem(sText, i - 1, Mach.m_bEnabled, MCH_OY.POCKETING)) ElseIf Mach.m_nType = MCH_OY.WATERJETTING Then ' Waterjet Dim sText As String = EgtMsg(90797) & " " & i.ToString() If Mach.m_bPause Then AddPauseText(sText) m_ItemList.Add(New NameIdLsBxItem(sText, i - 1, Mach.m_bEnabled, MCH_OY.WATERJETTING)) End If Next End Sub Private Sub EnableButtons() ' Per bottone PREV OmagOFFICEMap.refMachiningTabVM.PrevIsEnabled = (m_nCurrPhase > 1) ' Per bottone NEXT ' Se abilitato manipolatore If OmagOFFICEMap.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.MAN_MANIP) Or OmagOFFICEMap.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.AUTO_MANIP) Then ' Se in modifica If Not OmagOFFICEMap.refMachiningTabVM.IsShow Then ' Se allontanamento perpendicolare If OmagOFFICEMap.refMachiningTabVM.ByHand Then ' Ci deve essere almeno 1 taglio disabilitato e 1 e 1 solo passante OmagOFFICEMap.refMachiningTabVM.NextIsEnabled = (GetDisabledCutsCount() > 0 And GetSplitCutsCount() = 1) ' Altrimenti Else ' Ci deve essere almeno 1 taglio disabilitato e almeno 1 passante oppure fase successiva alla prima OmagOFFICEMap.refMachiningTabVM.NextIsEnabled = (GetDisabledCutsCount() > 0 And (GetSplitCutsCount() > 0 Or m_nCurrPhase > 1)) Or CurrentMachine.bRawFinalMove End If ' altrimenti sto solo visualizzando Else OmagOFFICEMap.refMachiningTabVM.NextIsEnabled = (m_nCurrPhase < EgtGetPhaseCount()) End If Else OmagOFFICEMap.refMachiningTabVM.NextIsEnabled = False End If ' Per bottone MODIFY OmagOFFICEMap.refMachiningTabVM.ModifyIsEnabled = OmagOFFICEMap.refMachiningTabVM.IsShow ' Per bottone AUTO OmagOFFICEMap.refMachiningTabVM.AutoIsEnabled = Not OmagOFFICEMap.refMachiningTabVM.IsShow And ((GetDisabledCutsCount() > 0 Or m_nCurrPhase = 1) And Not OmagOFFICEMap.refMachiningTabVM.ByHand) ' Altri bottoni SplitModeIsEnabled = Not OmagOFFICEMap.refMachiningTabVM.IsShow ' nascondo i comandi che non devono essere visualizzati in funzione delle lavorazioni attive If m_nCountSawing = 0 And (m_nCountWaterjetting > 0 Or m_nCountOtherMachining > 0) Then VisibilityButtonFromMachining(MCH_OY.WATERJETTING) Else VisibilityButtonFromMachining(MCH_OY.SAWING) End If End Sub Private Sub VerifyHomogenousMachining(ItemList As List(Of NameIdLsBxItem)) If IsNothing(ItemList) OrElse ItemList.Count = 0 Then OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() Return End If Dim nSawing As Integer = 0 Dim nWaterjetting As Integer = 0 Dim nOtherMachining As Integer = 0 ' conto il numero di tipi di lavprazioni For Each Item As NameIdLsBxItem In ItemList If Item.Type = MCH_OY.SAWING Then nSawing += 1 ElseIf Item.Type = MCH_OY.WATERJETTING Then nWaterjetting += 1 Else nOtherMachining += 1 End If Next ' verifico se le lavorazioni sono omeogenee If nSawing > 0 And (nWaterjetting > 0 Or nOtherMachining > 0) Then m_bAreHomogeneous = False VisibilityButtonFromMachining(MCH_OY.SAWING) ElseIf nSawing = 0 And nOtherMachining > 0 And nWaterjetting > 0 Then m_bAreHomogeneous = False VisibilityButtonFromMachining(MCH_OY.WATERJETTING) Else VisibilityButtonFromMachining(ItemList(0).Type) m_bAreHomogeneous = True End If ' eventualmente stampo messaggio If Not m_bAreHomogeneous Then OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() OmagOFFICEMap.refStatusBarVM.SetOutputMessage("Lavorazioni non omogenee", MSG_TYPE.WARNING) Else OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() End If End Sub Private Sub VisibilityButtonFromMachining(ByVal Type As Integer) If Type <> MCH_OY.SAWING Then CutBtnVisibility = Visibility.Hidden CutStartBtnVisibility = Visibility.Hidden CutEndBtnVisibility = Visibility.Hidden OutCenStartBtnVisibility = Visibility.Hidden OutCenEndBtnVisibility = Visibility.Hidden InvertBtnVisibility = Visibility.Hidden PauseBtnVisibility = Visibility.Hidden AllOutStartBtnVisibility = Visibility.Hidden AllCenStartBtnVisibility = Visibility.Hidden AllOutEndBtnVisibility = Visibility.Hidden AllCenEndBtnVisibility = Visibility.Hidden AllExtendBtnVisibility = Visibility.Hidden AllReduceBtnVisibility = Visibility.Hidden Else CutBtnVisibility = Visibility.Visible CutStartBtnVisibility = Visibility.Visible CutEndBtnVisibility = Visibility.Visible OutCenStartBtnVisibility = Visibility.Visible OutCenEndBtnVisibility = Visibility.Visible InvertBtnVisibility = Visibility.Visible PauseBtnVisibility = Visibility.Visible AllOutStartBtnVisibility = Visibility.Visible AllCenStartBtnVisibility = Visibility.Visible AllOutEndBtnVisibility = Visibility.Visible AllCenEndBtnVisibility = Visibility.Visible AllExtendBtnVisibility = Visibility.Visible AllReduceBtnVisibility = Visibility.Visible End If End Sub Private Function ModifyOtherLeadIn(nI As Integer, nLiOthType As Integer) As Boolean ' Modifico l'attacco delle lavorazioni inglobate For Each nMchId As Integer In m_MachiningList(nI).m_vOthId EgtSetCurrMachining(nMchId) EgtSetMachiningParam(MCH_MP.LEADINTYPE, nLiOthType) Next Return True End Function Private Function ModifyOtherLeadOut(nI As Integer, nLoOthType As Integer) As Boolean ' Modifico l'uscita delle lavorazioni inglobate For Each nMchId As Integer In m_MachiningList(nI).m_vOthId EgtSetCurrMachining(nMchId) EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, nLoOthType) Next Return True End Function Private Sub NumberDirectionMachining(nI As Integer, Optional bNumber As Boolean = True) EgtDisableModified() ' Determino se seconda lavorazione Dim sName As String = String.Empty EgtGetName(m_MachiningList(nI).m_nId, sName) Dim b2ndLav As Boolean = sName.Contains("_") Or sName.Contains("Drip") ' Ingombro complessivo della lavorazione Dim ptMin, ptMax As Point3d If Not BoxFromMachining(nI, ptMin, ptMax) Then Return ' Metto il numero nel centro Dim dRadXY = Point3d.DistXY(ptMin, ptMax) Dim dHtxt As Double = 50 Dim dRat As Double = 0.75 If dRadXY < 200 Then dHtxt = 40 dRat = 0.6 ElseIf dRadXY < 25 Then dHtxt = 25 dRat = 0.5 End If Dim vtXY As Vector3d = ptMax - ptMin vtXY.Normalize() Dim ptCen As Point3d = Point3d.Media(ptMin, ptMax) + vtXY * If(Not b2ndLav, -0.8, 0.8) * dHtxt ptCen.z = ptMax.z + 1 If bNumber Then Dim nNbrId As Integer = EgtCreateTextAdv(m_nNbrGrpId, ptCen, 0, (nI + 1).ToString(), "", 300, False, dHtxt, dRat, 0, INS_POS.MC) m_MachiningList(nI).m_nNbrId = nNbrId ' Aggiungo a numero info con identificativo della lavorazione e viceversa EgtSetInfo(nNbrId, "MId", m_MachiningList(nI).m_nId) EgtSetInfo(m_MachiningList(nI).m_nId, "NbrId", nNbrId) End If ' Se taglio con lama, metto la direzione accanto al numero If m_MachiningList(nI).m_nType = MCH_OY.SAWING Then Dim ptStart As New Point3d(ptCen + m_MachiningList(nI).m_vtDir * dHtxt) Dim vtDir As New Vector3d(m_MachiningList(nI).m_vtDir) Dim bTwin As Boolean = (Not m_MachiningList(nI).m_bEnableInvert OrElse Math.Abs(m_MachiningList(nI).m_dSideAng) > 0.1) Dim nArrId As Integer = AddMachiningDirection(ptStart, vtDir, dHtxt, bTwin) m_MachiningList(nI).m_nArrId = nArrId ' Aggiungo a freccia info con identificativo della lavorazione e viceversa EgtSetInfo(nArrId, "MId", m_MachiningList(nI).m_nId) EgtSetInfo(m_MachiningList(nI).m_nId, "ArrId", nArrId) Else m_MachiningList(nI).m_nArrId = GDB_ID.NULL End If ' Assegno colore a numero e freccia ColorNumberArrow(nI) EgtEnableModified() End Sub Private Function BoxFromMachining(nI As Integer, ByRef ptMin As Point3d, ByRef ptMax As Point3d) As Boolean If nI < 0 Then Return False ' Lavorazione principale If Not BoxFromSingleMachining(m_MachiningList(nI).m_nId, ptMin, ptMax) Then Return False End If ' Eventuali lavorazioni inglobate For Each nId As Integer In m_MachiningList(nI).m_vOthId Dim ptMchMin, ptMchMax As Point3d If BoxFromSingleMachining(nId, ptMchMin, ptMchMax) Then ptMin.x = Math.Min(ptMin.x, ptMchMin.x) ptMin.y = Math.Min(ptMin.y, ptMchMin.y) ptMin.z = Math.Min(ptMin.z, ptMchMin.z) ptMax.x = Math.Max(ptMax.x, ptMchMax.x) ptMax.y = Math.Max(ptMax.y, ptMchMax.y) ptMax.z = Math.Max(ptMax.z, ptMchMax.z) End If Next Return True End Function Private Function BoxFromSingleMachining(nOperId As Integer, ByRef ptMin As Point3d, ByRef ptMax As Point3d) As Boolean ' Recupero il preview della lavorazione Dim nPvId As Integer = GDB_ID.NULL EgtGetInfo(EgtGetFirstNameInGroup(nOperId, NAME_PREVIEW), INFO_PV_ONPART_ID, nPvId) Return EgtGetBBoxGlob(nPvId, GDB_BB.STANDARD, ptMin, ptMax) End Function Private Function AddMachiningDirection(ptStart As Point3d, vtDir As Vector3d, dLen As Double, bTwin As Boolean) As Integer Dim dArrX As Double = dLen * Math.Cos(30 * Math.PI / 180) Dim dArrY As Double = dLen * Math.Sin(30 * Math.PI / 180) Dim nTmpId As Integer = EgtCreateLine(m_nNbrGrpId, Point3d.ORIG() + dArrY * Vector3d.Y_AX(), Point3d.ORIG() + dArrX * Vector3d.X_AX()) Dim nCrvId As Integer = EgtCreateCurveCompo(m_nNbrGrpId, nTmpId, True) EgtAddCurveCompoLine(nCrvId, Point3d.ORIG() - dArrY * Vector3d.Y_AX()) If bTwin Then EgtAddCurveCompoLine(nCrvId, Point3d.ORIG() + 2 * dArrX * Vector3d.X_AX()) EgtCloseCurveCompo(nCrvId) End If Dim frLoc As New Frame3d(ptStart, vtDir, Vector3d.Z_AX() ^ vtDir, Vector3d.Z_AX()) EgtTransform(nCrvId, frLoc) Return nCrvId End Function Private Sub MarkMachining(nI As Integer, bMark As Boolean) If nI < 0 Then Return Dim nOperId As Integer = m_MachiningList(nI).m_nId ' Evidenzio la lavorazione principale MarkSingleMachining(nOperId, bMark) ' Evidenzio l'eventuale numero della lavorazione MarkNumberArrow(nI, bMark) ' Marco anche le lavorazioni inglobate For Each nId As Integer In m_MachiningList(nI).m_vOthId MarkSingleMachining(nId, bMark) Next End Sub Private Sub MarkSingleMachining(nOperId As Integer, bMark As Boolean) Dim nPvId As Integer = GDB_ID.NULL If EgtGetInfo(EgtGetFirstNameInGroup(nOperId, NAME_PREVIEW), INFO_PV_ONPART_ID, nPvId) Then If bMark Then EgtSetMark(nPvId) Else EgtResetMark(nPvId) End If End If End Sub Private Sub MarkNumberArrow(nI As Integer, bMark As Boolean) If nI < 0 Then Return Dim nNbrId As Integer = m_MachiningList(nI).m_nNbrId Dim nArrId As Integer = m_MachiningList(nI).m_nArrId If bMark Then EgtSetMark(nNbrId) EgtSetMark(nArrId) Else EgtResetMark(nNbrId) EgtResetMark(nArrId) End If End Sub Private Sub ColorNumberArrow(nI As Integer) If nI < 0 Then Return Dim nNbrId As Integer = m_MachiningList(nI).m_nNbrId Dim nArrId As Integer = m_MachiningList(nI).m_nArrId If m_MachiningList(nI).m_bEnabled Then If m_MachiningList(nI).m_nInterf = FMI_TYPE.NONE Then EgtSetColor(nNbrId, COL_MCH_FREE) EgtSetColor(nArrId, COL_MCH_FREE) Else EgtSetColor(nNbrId, COL_MCH_INTERF) EgtSetColor(nArrId, COL_MCH_INTERF) End If Else If m_MachiningList(nI).m_nInterf = FMI_TYPE.NONE Then EgtResetColor(nNbrId) EgtResetColor(nArrId) ElseIf Not m_MachiningList(nI).m_bEnabled Then EgtSetColor(nNbrId, COL_MCH_DIS_INTERF) EgtSetColor(nArrId, COL_MCH_DIS_INTERF) End If End If End Sub Private Sub RemoveMarkAndNumbers() EgtDisableModified() ' cancello evidenziazione If m_CurrFirstInd >= 0 Then For Index = m_CurrFirstInd To m_CurrLastInd MarkMachining(m_ItemList(Index).Ind, False) Next m_CurrFirstInd = -1 m_CurrLastInd = -1 End If ' cancello gruppo di numerazione e ripristino colori lavorazioni EgtErase(m_nNbrGrpId) For i As Integer = 0 To m_MachiningList.Count() - 1 ColorMachining(m_MachiningList(i), True) Next EgtEnableModified() End Sub Private Sub SwapStartEndData(nI As Integer) ' Swap angoli precedente e successivo Dim dAng As Double = m_MachiningList(nI).m_dPrevAng m_MachiningList(nI).m_dPrevAng = m_MachiningList(nI).m_dNextAng m_MachiningList(nI).m_dNextAng = dAng ' Swap lunghezze libere Dim dFreeLen As Double = m_MachiningList(nI).m_dStartFreeLen m_MachiningList(nI).m_dStartFreeLen = m_MachiningList(nI).m_dEndFreeLen m_MachiningList(nI).m_dEndFreeLen = dFreeLen ' Swap stato di allungamento Dim bAll As Boolean = m_MachiningList(nI).m_bStartAll m_MachiningList(nI).m_bStartAll = m_MachiningList(nI).m_bEndAll m_MachiningList(nI).m_bEndAll = bAll ' Swap possibilità di allungamento Dim bCanAll As Boolean = m_MachiningList(nI).m_bCanStartAll m_MachiningList(nI).m_bCanStartAll = m_MachiningList(nI).m_bCanEndAll m_MachiningList(nI).m_bCanEndAll = bCanAll ' Swap stato interferenza If (m_MachiningList(nI).m_nInterf And FMI_TYPE.LI) <> 0 And (m_MachiningList(nI).m_nInterf And FMI_TYPE.LO) = 0 Then m_MachiningList(nI).m_nInterf -= FMI_TYPE.LI m_MachiningList(nI).m_nInterf += FMI_TYPE.LO ElseIf (m_MachiningList(nI).m_nInterf And FMI_TYPE.LI) = 0 And (m_MachiningList(nI).m_nInterf And FMI_TYPE.LO) <> 0 Then m_MachiningList(nI).m_nInterf += FMI_TYPE.LI m_MachiningList(nI).m_nInterf -= FMI_TYPE.LO End If ' Swap Allungamento Utente Dim dOrigUsal As Double = 0 EgtGetInfo(m_MachiningList(nI).m_nId, INFO_MCH_USER_SAL, dOrigUsal) Dim dOrigUeal As Double = 0 EgtGetInfo(m_MachiningList(nI).m_nId, INFO_MCH_USER_EAL, dOrigUeal) EgtSetInfo(m_MachiningList(nI).m_nId, INFO_MCH_USER_SAL, dOrigUeal) EgtSetInfo(m_MachiningList(nI).m_nId, INFO_MCH_USER_EAL, dOrigUsal) End Sub #End Region ' METHODS #Region "COMMANDS" #Region "MoveCommands" Public ReadOnly Property MoveUpCommand As ICommand Get If m_cmdMoveUp Is Nothing Then m_cmdMoveUp = New Command(AddressOf MoveUp) End If Return m_cmdMoveUp End Get End Property Public Sub MoveUp(ByVal param As Object) MoveItem(-1) End Sub Public ReadOnly Property MoveDownCommand As ICommand Get If m_cmdMoveDown Is Nothing Then m_cmdMoveDown = New Command(AddressOf MoveDown) End If Return m_cmdMoveDown End Get End Property Public Sub MoveDown(ByVal param As Object) MoveItem(+1) End Sub Public Sub MoveItem(direction As Integer) ' Checking selected item If m_CurrFirstInd = -1 Then Return End If ' Se la direzione è giù If direction = 1 And m_CurrLastInd < m_ItemList.Count - 1 Then ' sposto il successivo prima di tutti i selezionati m_ItemList.Move(m_CurrLastInd + 1, m_CurrFirstInd) MoveMachining(m_CurrLastInd + 1, m_CurrFirstInd) ' aggiorno gli indici degli elementi coinvolti nello spostamento (selezionati e non) For index = m_CurrLastInd + 1 To m_CurrFirstInd Step -1 m_ItemList(index).Ind = index Next m_CurrFirstInd += 1 m_CurrLastInd += 1 ElseIf direction = -1 And m_CurrFirstInd > 0 Then ' sposto il precedente dopo tutti i selezionati m_ItemList.Move(m_CurrFirstInd - 1, m_CurrLastInd) MoveMachining(m_CurrFirstInd - 1, m_CurrLastInd) ' aggiorno gli indici degli elementi coinvolti nello spostamento (selezionati e non) For index = m_CurrFirstInd - 1 To m_CurrLastInd m_ItemList(index).Ind = index Next m_CurrFirstInd -= 1 m_CurrLastInd -= 1 End If ' Imposto flag di modifica m_bModified = True End Sub Private Sub MoveMachining(oldIndex As Integer, newIndex As Integer) Dim item As SplitMach = m_MachiningList(oldIndex) m_MachiningList.RemoveAt(oldIndex) m_MachiningList.Insert(newIndex, item) End Sub #End Region ' MoveCommands #Region "OnOffCommand" Public ReadOnly Property OnOffCommand As ICommand Get If m_cmdOnOff Is Nothing Then m_cmdOnOff = New Command(AddressOf OnOff) End If Return m_cmdOnOff End Get End Property Public Sub OnOff(ByVal param As Object) If m_CurrFirstInd = -1 Then Return For Index = m_CurrFirstInd To m_CurrLastInd If m_ItemList(Index).IsSelected Then If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind If m_MachiningList(nI).m_bEnabled Then m_MachiningList(nI).m_bEnabled = False m_ItemList(Index).bIsActive = False Else m_MachiningList(nI).m_bEnabled = True m_ItemList(Index).bIsActive = True End If ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) End If Next EgtDraw() ' Imposto flag di modifica m_bModified = True ' Abilitazione bottone Next ' EnableButtons() ' recupero l'elenco degli elementi selezionati Dim ItemList As New List(Of NameIdLsBxItem) For Each Item As NameIdLsBxItem In m_SelectedItemsList ' MachiningLsBx.SelectedItems ItemList.Add(Item) Next 'For Each Item As NameIdLsBxItem In m_ItemList ' If Item.bIsActive Then ItemList.Add(Item) 'Next VerifyHomogenousMachining(ItemList) End Sub #End Region ' OnOffCommand #Region "AllOnCommand" Public ReadOnly Property AllOnCommand As ICommand Get If m_cmdAllOn Is Nothing Then m_cmdAllOn = New Command(AddressOf AllOn) End If Return m_cmdAllOn End Get End Property Public Sub AllOn(ByVal param As Object) For nI As Integer = 0 To m_MachiningList.Count() - 1 If Not m_MachiningList(nI).m_bEnabled Then m_MachiningList(nI).m_bEnabled = True m_ItemList(nI).bIsActive = True ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) End If Next EgtDraw() ' Imposto flag di modifica m_bModified = True ' Abilitazione bottone Next EnableButtons() End Sub #End Region ' AllOnCommand #Region "AllOffCommand" Public ReadOnly Property AllOffCommand As ICommand Get If m_cmdAllOff Is Nothing Then m_cmdAllOff = New Command(AddressOf AllOff) End If Return m_cmdAllOff End Get End Property Public Sub AllOff(ByVal param As Object) For nI As Integer = 0 To m_MachiningList.Count() - 1 If m_MachiningList(nI).m_bEnabled Then m_MachiningList(nI).m_bEnabled = False m_ItemList(nI).bIsActive = False ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) End If Next EgtDraw() ' Imposto flag di modifica m_bModified = True ' Abilitazione bottone Next EnableButtons() End Sub #End Region ' AllOffCommand #Region "CutCommands" Public ReadOnly Property CutCommand As ICommand Get If m_cmdCut Is Nothing Then m_cmdCut = New Command(AddressOf Cut) End If Return m_cmdCut End Get End Property Public Sub Cut(ByVal param As Object) If m_CurrFirstInd = -1 Then Return Dim bGenModif As Boolean = False For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind ' Provo ad entrambi gli estremi Dim bModif As Boolean = AdjustBothCuts(nI) ' Provo all'inizio If Not bModif Then bModif = AdjustStartCut(nI) ' Provo alla fine If Not bModif Then bModif = AdjustEndCut(nI) ' Se modificato qualcosa If bModif Then bGenModif = True End If Next ' Se modificato qualcosa If bGenModif Then EgtDraw() m_bModified = True End If ' Aggiono abilitazione bottoni EnableButtons() End Sub Public ReadOnly Property CutStartCommand As ICommand Get If m_cmdCutStart Is Nothing Then m_cmdCutStart = New Command(AddressOf CutStart) End If Return m_cmdCutStart End Get End Property Public Sub CutStart(ByVal param As Object) If m_CurrFirstInd = -1 Then Return Dim bGenModif As Boolean = False For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind ' Eseguo If AdjustStartCut(nI) Then bGenModif = True End If Next ' Se modificato qualcosa If bGenModif Then EgtDraw() m_bModified = True End If ' Aggiono abilitazione bottoni EnableButtons() End Sub Public ReadOnly Property CutEndCommand As ICommand Get If m_cmdCutEnd Is Nothing Then m_cmdCutEnd = New Command(AddressOf CutEnd) End If Return m_cmdCutEnd End Get End Property Public Sub CutEnd(ByVal param As Object) If m_CurrFirstInd = -1 Then Return Dim bGenModif As Boolean = False For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind ' Eseguo If AdjustEndCut(nI) Then bGenModif = True End If Next ' Se modificato qualcosa If bGenModif Then EgtDraw() m_bModified = True End If ' Aggiono abilitazione bottoni EnableButtons() End Sub Private Function AdjustBothCuts(nI As Integer, Optional bAllForced As Boolean = False, Optional bAccForced As Boolean = False) As Boolean ' Verifico che entrambi gli estremi siano allungabili If Not (m_MachiningList(nI).m_bCanStartAll And m_MachiningList(nI).m_bCanEndAll) Then Return False ' Eseguo allungamento o riporto allo standard EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLiPrev As Integer EgtGetMachiningParam(MCH_MP.LEADINTYPE, nLiPrev) Dim nLoPrev As Integer EgtGetMachiningParam(MCH_MP.LEADOUTTYPE, nLoPrev) If (m_MachiningList(nI).m_bStartAll Or m_MachiningList(nI).m_bEndAll) And Not bAllForced Then ' accorcio If nLiPrev = MCH_SAW_LI.EXT_OUT Then EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.OUT) Else EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.CENT) End If If nLoPrev = MCH_SAW_LO.EXT_OUT Then EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.OUT) Else EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.CENT) End If UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) m_MachiningList(nI).m_bStartAll = False m_MachiningList(nI).m_bEndAll = False ElseIf m_MachiningList(nI).m_bEnabled And Not bAccForced Then ' allungo If nLiPrev = MCH_SAW_LI.OUT Then EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_OUT) Else EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_CENT) End If If nLoPrev = MCH_SAW_LO.OUT Then EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_OUT) Else EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_CENT) End If UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) m_MachiningList(nI).m_bStartAll = True m_MachiningList(nI).m_bEndAll = True End If ColorMachining(m_MachiningList(nI)) Return True End Function Private Function AdjustStartCut(nI As Integer, Optional bAllForced As Boolean = False, Optional bAccForced As Boolean = False) As Boolean ' Verifico che l'estremo iniziale sia allungabile If Not m_MachiningList(nI).m_bCanStartAll Then Return False ' Eseguo allungamento o riporto allo standard EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLiPrev As Integer EgtGetMachiningParam(MCH_MP.LEADINTYPE, nLiPrev) If m_MachiningList(nI).m_bStartAll And Not bAllForced Then ' accorcio If nLiPrev = MCH_SAW_LI.EXT_OUT Then EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.OUT) Else EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.CENT) End If UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) m_MachiningList(nI).m_bStartAll = False ElseIf m_MachiningList(nI).m_bEnabled And Not bAccForced Then ' allungo If nLiPrev = MCH_SAW_LI.OUT Then EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_OUT) Else EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_CENT) End If UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) m_MachiningList(nI).m_bStartAll = True End If ColorMachining(m_MachiningList(nI)) Return True End Function Private Function AdjustEndCut(nI As Integer, Optional bAllForced As Boolean = False, Optional bAccForced As Boolean = False) As Boolean ' Verifico che l'estremo finale sia allungabile If Not m_MachiningList(nI).m_bCanEndAll Then Return False ' Eseguo allungamento o riporto allo standard EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLoPrev As Integer EgtGetMachiningParam(MCH_MP.LEADOUTTYPE, nLoPrev) If m_MachiningList(nI).m_bEndAll And Not bAllForced Then ' accorcio If nLoPrev = MCH_SAW_LO.EXT_OUT Then EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.OUT) Else EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.CENT) End If m_MachiningList(nI).m_bEndAll = False ElseIf m_MachiningList(nI).m_bEnabled And Not bAccForced Then ' allungo If nLoPrev = MCH_SAW_LO.OUT Then EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_OUT) Else EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_CENT) End If m_MachiningList(nI).m_bEndAll = True End If UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ColorMachining(m_MachiningList(nI)) Return True End Function #End Region ' CutCommands #Region "OutCenStartCommand" Public ReadOnly Property OutCenStartCommand As ICommand Get If m_cmdOutCenStart Is Nothing Then m_cmdOutCenStart = New Command(AddressOf OutCenStart) End If Return m_cmdOutCenStart End Get End Property Public Sub OutCenStart(ByVal param As Object) If m_CurrFirstInd = -1 Then Return Dim bGenModif As Boolean = False For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind If m_MachiningList(nI).m_sLay = NAME_OUTLOOP Then EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLiPrev As Integer EgtGetMachiningParam(MCH_MP.LEADINTYPE, nLiPrev) If nLiPrev = MCH_SAW_LI.OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.CENT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLiPrev = MCH_SAW_LI.EXT_OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.CENT) ElseIf nLiPrev = MCH_SAW_LI.CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.OUT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLiPrev = MCH_SAW_LI.EXT_CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.OUT) End If ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) bGenModif = True End If Next ' Se modificato qualcosa If bGenModif Then EgtDraw() m_bModified = True End If End Sub #End Region ' OutCenStartCommand #Region "AllOutStartCommand" Public ReadOnly Property AllOutStartCommand As ICommand Get If m_cmdAllOutStart Is Nothing Then m_cmdAllOutStart = New Command(AddressOf AllOutStart) End If Return m_cmdAllOutStart End Get End Property Public Sub AllOutStart(ByVal param As Object) For nI As Integer = 0 To m_MachiningList.Count() - 1 EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLiPrev As Integer EgtGetMachiningParam(MCH_MP.LEADINTYPE, nLiPrev) If nLiPrev = MCH_SAW_LI.CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.OUT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLiPrev = MCH_SAW_LI.EXT_CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.OUT) End If ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) Next EgtDraw() ' Imposto flag di modifica m_bModified = True End Sub #End Region ' AllOutStartCommand #Region "AllCenStartCommand" Public ReadOnly Property AllCenStartCommand As ICommand Get If m_cmdAllCenStart Is Nothing Then m_cmdAllCenStart = New Command(AddressOf AllCenStart) End If Return m_cmdAllCenStart End Get End Property Public Sub AllCenStart(ByVal param As Object) For nI As Integer = 0 To m_MachiningList.Count() - 1 EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLiPrev As Integer EgtGetMachiningParam(MCH_MP.LEADINTYPE, nLiPrev) If nLiPrev = MCH_SAW_LI.OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.CENT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLiPrev = MCH_SAW_LI.EXT_OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADINTYPE, MCH_SAW_LI.EXT_CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadIn(nI, MCH_SAW_LI.CENT) End If ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) Next EgtDraw() ' Imposto flag di modifica m_bModified = True End Sub #End Region ' AllCenStartCommand #Region "OutCenEndCommand" Public ReadOnly Property OutCenEndCommand As ICommand Get If m_cmdOutCenEnd Is Nothing Then m_cmdOutCenEnd = New Command(AddressOf OutCenEnd) End If Return m_cmdOutCenEnd End Get End Property Public Sub OutCenEnd(ByVal param As Object) If m_CurrFirstInd = -1 Then Return Dim bGenModif As Boolean = False For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind If m_MachiningList(nI).m_sLay = NAME_OUTLOOP Then EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLoPrev As Integer EgtGetMachiningParam(MCH_MP.LEADOUTTYPE, nLoPrev) If nLoPrev = MCH_SAW_LO.OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.CENT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLoPrev = MCH_SAW_LO.EXT_OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.CENT) ElseIf nLoPrev = MCH_SAW_LO.CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.OUT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLoPrev = MCH_SAW_LO.EXT_CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.OUT) End If ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) bGenModif = True End If Next ' Se modificato qualcosa If bGenModif Then EgtDraw() m_bModified = True End If End Sub #End Region ' OutCenEndCommand #Region "AllOutEndCommand" Public ReadOnly Property AllOutEndCommand As ICommand Get If m_cmdAllOutEnd Is Nothing Then m_cmdAllOutEnd = New Command(AddressOf AllOutEnd) End If Return m_cmdAllOutEnd End Get End Property Public Sub AllOutEnd(ByVal param As Object) For nI As Integer = 0 To m_MachiningList.Count() - 1 EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLoPrev As Integer EgtGetMachiningParam(MCH_MP.LEADOUTTYPE, nLoPrev) If nLoPrev = MCH_SAW_LO.CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.OUT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLoPrev = MCH_SAW_LO.EXT_CENT Then ' allungo EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_OUT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.OUT) End If ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) Next EgtDraw() ' Imposto flag di modifica m_bModified = True End Sub #End Region ' AllOutEndCommand #Region "AllCenEndCommand" Public ReadOnly Property AllCenEndCommand As ICommand Get If m_cmdAllCenEnd Is Nothing Then m_cmdAllCenEnd = New Command(AddressOf AllCenEnd) End If Return m_cmdAllCenEnd End Get End Property Public Sub AllCenEnd(ByVal param As Object) For nI As Integer = 0 To m_MachiningList.Count() - 1 EgtSetCurrMachining(m_MachiningList(nI).m_nId) Dim nLoPrev As Integer EgtGetMachiningParam(MCH_MP.LEADOUTTYPE, nLoPrev) If nLoPrev = MCH_SAW_LO.OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.CENT) ' ri-verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ElseIf nLoPrev = MCH_SAW_LO.EXT_OUT Then ' accorcio EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, MCH_SAW_LO.EXT_CENT) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ModifyOtherLeadOut(nI, MCH_SAW_LO.CENT) End If ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) Next EgtDraw() ' Imposto flag di modifica m_bModified = True End Sub #End Region ' AllCenEndCommand #Region "AllExtendCommand" Public ReadOnly Property AllExtendCommand As ICommand Get If m_cmdAllExtend Is Nothing Then m_cmdAllExtend = New Command(AddressOf AllExtend) End If Return m_cmdAllExtend End Get End Property Public Sub AllExtend(ByVal param As Object) Dim bModif As Boolean = False For nI As Integer = 0 To m_MachiningList.Count() - 1 ' Provo ad entrambi gli estremi Dim bOneModif As Boolean = AdjustBothCuts(nI, True, False) ' Provo all'inizio If Not bOneModif Then bOneModif = AdjustStartCut(nI, True, False) ' Provo alla fine If Not bOneModif Then bOneModif = AdjustEndCut(nI, True, False) ' Aggiorno flag globale If bOneModif Then bModif = True Next ' Se modificato qualcosa If bModif Then EgtDraw() m_bModified = True End If ' Abilitazione bottone Next EnableButtons() End Sub #End Region ' AllExtendCommand #Region "AllReduceCommand" Public ReadOnly Property AllReduceCommand As ICommand Get If m_cmdAllReduce Is Nothing Then m_cmdAllReduce = New Command(AddressOf AllReduce) End If Return m_cmdAllReduce End Get End Property Public Sub AllReduce(ByVal param As Object) Dim bModif As Boolean = False For nI As Integer = 0 To m_MachiningList.Count() - 1 ' Provo ad entrambi gli estremi Dim bOneModif As Boolean = AdjustBothCuts(nI, False, True) ' Provo all'inizio If Not bOneModif Then bOneModif = AdjustStartCut(nI, False, True) ' Provo alla fine If Not bOneModif Then bOneModif = AdjustEndCut(nI, False, True) ' Aggiorno flag globale If bOneModif Then bModif = True Next ' Se modificato qualcosa If bModif Then EgtDraw() m_bModified = True End If ' Abilitazione bottone Next EnableButtons() End Sub #End Region ' AllReduceCommand #Region "ModifStartCommand" Public ReadOnly Property ModifStartCommand As ICommand Get If m_cmdModifStart Is Nothing Then m_cmdModifStart = New Command(AddressOf ModifStart) End If Return m_cmdModifStart End Get End Property Public Sub ModifStart(ByVal param As Object) Dim bFirstInd As Boolean = True Dim bFirstMill As Boolean = True Dim bFirstWJ As Boolean = True ' elenco delle variabili : MCH_MY.SAWING/MCH_MY.MILLING Dim dUsal As Double = 0 ' elenco delle variabili : MCH_MY.WATERJETTING Dim dWJAddLen As Double = 0 Dim bWJLiHole As Boolean = True Dim nWJTangDist As Double = 0 Dim nWJPerpDist As Double = 0 Dim nWJLeadInType As Integer = 0 ' Recupero la lavorazione corrente If m_CurrFirstInd = -1 Then Return Dim bGenModif As Boolean = False For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind Dim nOperId As Integer = m_MachiningList(nI).m_nId Dim nMachiningType As Integer = EgtGetOperationType(nOperId) ' Se taglio con lama If nMachiningType = MCH_MY.SAWING Then Dim dOrigUsal As Double = 0 EgtGetInfo(nOperId, INFO_MCH_USER_SAL, dOrigUsal) ' Dialogo richiesta valore If bFirstInd Then Dim ModifStartWindow As New ModifStartEndCutWindowV Dim ModifStartWindowVM As New ModifStartEndCutWindowVM ModifStartWindowVM.Title = "Sawing" ModifStartWindow.DataContext = ModifStartWindowVM ModifStartWindow.Owner = Application.Current.MainWindow ModifStartWindowVM.SetVal(dOrigUsal) If Not ModifStartWindow.ShowDialog() Then Return ' Modifica della lavorazione dUsal = ModifStartWindowVM.GetVal() bFirstInd = False End If Dim bRepeat As Boolean = False Do EgtSetCurrMachining(nOperId) Dim dAddLen As Double = 0 EgtGetMachiningParam(MCH_MP.STARTADDLEN, dAddLen) If dAddLen - dOrigUsal < -10 * EPS_SMALL Then Return EgtSetMachiningParam(MCH_MP.STARTADDLEN, dAddLen + dUsal - dOrigUsal) EgtSetInfo(nOperId, INFO_MCH_USER_SAL, dUsal) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) bRepeat = Not UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) If bRepeat Then EgtSetMachiningParam(MCH_MP.STARTADDLEN, dOrigUsal) EgtSetInfo(nOperId, INFO_MCH_USER_SAL, dOrigUsal) dUsal = dOrigUsal End If Loop Until Not bRepeat ' verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) bGenModif = True ElseIf nMachiningType = MCH_MY.MILLING Then ' And m_MachiningList(nI).m_sLay = NAME_ONPATH ' leggo il valore salvato nella geometria Dim dOrigUsal As Double = 0 EgtGetInfo(nOperId, INFO_MCH_USER_SAL, dOrigUsal) ' Dialogo richiesta valore If bFirstMill Then Dim ModifStartWindow As New ModifStartEndCutWindowV Dim ModifStartWindowVM As New ModifStartEndCutWindowVM ModifStartWindowVM.Title = "Milling" ModifStartWindow.DataContext = ModifStartWindowVM ModifStartWindow.Owner = Application.Current.MainWindow ModifStartWindowVM.SetVal(dOrigUsal) If Not ModifStartWindow.ShowDialog() Then Return ' Modifica della lavorazione dUsal = ModifStartWindowVM.GetVal() bFirstMill = False End If ' Modifica della lavorazione EgtSetCurrMachining(nOperId) Dim dAddLen As Double = 0 EgtGetMachiningParam(MCH_MP.STARTADDLEN, dAddLen) EgtSetMachiningParam(MCH_MP.STARTADDLEN, dAddLen + dUsal - dOrigUsal) EgtSetInfo(nOperId, INFO_MCH_USER_SAL, dUsal) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) bGenModif = True ' se altrimenti getto d'acqua ElseIf nMachiningType = MCH_MY.WATERJETTING Then ' Recupero i valori attuali della lavorazione If bFirstWJ Then Dim bOriginalIsLeadIn As Boolean = True Dim dOriginalAddLen As Double = 0 Dim bOriginalLiHole As Boolean = True Dim nOriginalTangDist As Double = 0 Dim nOriginalPerpDist As Double = 0 Dim nOriginalLeadInType As Integer = 0 EgtSetCurrMachining(nOperId) EgtGetMachiningParam(MCH_MP.STARTADDLEN, dOriginalAddLen) EgtGetMachiningParam(MCH_MP.LIHOLE, bOriginalLiHole) EgtGetMachiningParam(MCH_MP.LITANG, nOriginalTangDist) EgtGetMachiningParam(MCH_MP.LIPERP, nOriginalPerpDist) EgtGetMachiningParam(MCH_MP.LEADINTYPE, nOriginalLeadInType) ' Dialogo richiesta valori Dim ModifStartWnd As New ModifStartEndWjWindowV Dim ModifStartWndVM As New ModifStartEndWjWindowVM ModifStartWndVM.Title = "Water jetting" ModifStartWnd.DataContext = ModifStartWndVM ModifStartWnd.Owner = Application.Current.MainWindow ModifStartWndVM.HoleVisibility = Visibility.Visible ModifStartWndVM.LeadInVisibility = Visibility.Visible ModifStartWndVM.LeadOutVisibility = Visibility.Hidden ModifStartWndVM.SetVal(dOriginalAddLen) ModifStartWndVM.SetHole(bOriginalLiHole) ModifStartWndVM.SetLeadInType(nOriginalLeadInType) ModifStartWndVM.SetLiTangDist(nOriginalTangDist) ModifStartWndVM.SetLiPerpDist(nOriginalPerpDist) If Not ModifStartWnd.ShowDialog() Then Return dWJAddLen = ModifStartWndVM.GetVal() bWJLiHole = ModifStartWndVM.GetHole() nWJTangDist = ModifStartWndVM.GetLiTangDist() nWJPerpDist = ModifStartWndVM.GetLiPerpDist() nWJLeadInType = ModifStartWndVM.GetLeadInType().Id bFirstWJ = False End If ' Modifica della lavorazione EgtSetCurrMachining(nOperId) EgtSetMachiningParam(MCH_MP.LIHOLE, bWJLiHole) EgtSetMachiningParam(MCH_MP.STARTADDLEN, dWJAddLen) EgtSetMachiningParam(MCH_MP.LEADINTYPE, nWJLeadInType) EgtSetMachiningParam(MCH_MP.LITANG, nWJTangDist) EgtSetMachiningParam(MCH_MP.LIPERP, nWJPerpDist) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ' verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) bGenModif = True End If Next ' Se modificato qualcosa If bGenModif Then EgtDraw() m_bModified = True End If End Sub #End Region ' ModifStartCommand #Region "ModifEndCommand" Public ReadOnly Property ModifEndCommand As ICommand Get If m_cmdModifEnd Is Nothing Then m_cmdModifEnd = New Command(AddressOf ModifEnd) End If Return m_cmdModifEnd End Get End Property Public Sub ModifEnd(ByVal param As Object) Dim bFirstInd As Boolean = True Dim bFirstMill As Boolean = True Dim bFirstWJ As Boolean = True ' elenco delle variabili : MCH_MY.SAWING/MCH_MY.MILLING Dim dUeal As Double = 0 ' elenco delle variabili : MCH_MY.WATERJETTING Dim dWJAddLen As Double = 0 Dim nWJTangDist As Double = 0 Dim nWJPerpDist As Double = 0 Dim nWJLeadInType As Integer = 0 ' Recupero la lavorazione corrente If m_CurrFirstInd = -1 Then Return Dim bGenModif As Boolean = False For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind Dim nOperId As Integer = m_MachiningList(nI).m_nId Dim nMachiningType As Integer = EgtGetOperationType(nOperId) ' Se taglio con lama If nMachiningType = MCH_MY.SAWING Then Dim dOrigUeal As Double = 0 EgtGetInfo(nOperId, INFO_MCH_USER_EAL, dOrigUeal) ' Dialogo richiesta valore If bFirstInd Then Dim ModifStartWindow As New ModifStartEndCutWindowV Dim ModifStartWindowVM As New ModifStartEndCutWindowVM ModifStartWindowVM.Title = "Sawing" ModifStartWindow.DataContext = ModifStartWindowVM ModifStartWindow.Owner = Application.Current.MainWindow ModifStartWindowVM.SetVal(dOrigUeal) If Not ModifStartWindow.ShowDialog() Then Return ' Modifica della lavorazione dUeal = ModifStartWindowVM.GetVal() bFirstInd = False End If Dim bRepeat As Boolean = False Do EgtSetCurrMachining(nOperId) Dim dAddLen As Double = 0 EgtGetMachiningParam(MCH_MP.ENDADDLEN, dAddLen) If dAddLen - dOrigUeal < -10 * EPS_SMALL Then Return End If EgtSetMachiningParam(MCH_MP.ENDADDLEN, dAddLen + dUeal - dOrigUeal) EgtSetInfo(nOperId, INFO_MCH_USER_EAL, dUeal) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) bRepeat = Not UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) If bRepeat Then EgtSetMachiningParam(MCH_MP.ENDADDLEN, dOrigUeal) EgtSetInfo(nOperId, INFO_MCH_USER_EAL, dOrigUeal) dUeal = dOrigUeal End If Loop Until Not bRepeat ' verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) bGenModif = True ElseIf nMachiningType = MCH_MY.MILLING Then ' And m_MachiningList(nI).m_sLay = NAME_ONPATH Dim dOrigUeal As Double = 0 EgtGetInfo(nOperId, INFO_MCH_USER_EAL, dOrigUeal) ' ------------------ INIZIO PREPARAZIONE TASTIERINO VIRTUALE ------------------ If bFirstMill Then Dim ModifStartWindow As New ModifStartEndCutWindowV Dim ModifStartWindowVM As New ModifStartEndCutWindowVM ModifStartWindowVM.Title = "Milling" ModifStartWindow.DataContext = ModifStartWindowVM ModifStartWindow.Owner = Application.Current.MainWindow ModifStartWindowVM.SetVal(dOrigUeal) If Not ModifStartWindow.ShowDialog() Then Return ' Modifica della lavorazione dUeal = ModifStartWindowVM.GetVal() bFirstMill = False End If ' ------------------ FINE PREPARAZIONE TASTIERINO VIRTUALE ------------------ ' Modifica della lavorazione EgtSetCurrMachining(nOperId) Dim dAddLen As Double = 0 EgtGetMachiningParam(MCH_MP.ENDADDLEN, dAddLen) EgtSetMachiningParam(MCH_MP.ENDADDLEN, dAddLen + dUeal - dOrigUeal) EgtSetInfo(nOperId, INFO_MCH_USER_EAL, dUeal) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) bGenModif = True ' se altrimenti getto d'acqua ElseIf nMachiningType = MCH_MY.WATERJETTING Then ' Recupero i valori attuali della lavorazione If bFirstWJ Then Dim dAddLen As Double = 0 Dim nTangDist As Double = 0 Dim nPerpDist As Double = 0 Dim LeadOutTypeId As Integer = 0 EgtSetCurrMachining(nOperId) EgtGetMachiningParam(MCH_MP.ENDADDLEN, dAddLen) EgtGetMachiningParam(MCH_MP.LOTANG, nTangDist) EgtGetMachiningParam(MCH_MP.LOPERP, nPerpDist) EgtGetMachiningParam(MCH_MP.LEADOUTTYPE, LeadOutTypeId) ' Dialogo richiesta valori Dim ModifStartWnd As New ModifStartEndWjWindowV() Dim ModifStartWndVM As New ModifStartEndWjWindowVM ModifStartWndVM.Title = "Water jetting" ModifStartWnd.DataContext = ModifStartWndVM ModifStartWnd.Owner = Application.Current.MainWindow ModifStartWndVM.HoleVisibility = Visibility.Hidden ModifStartWndVM.LeadInVisibility = Visibility.Hidden ModifStartWndVM.LeadOutVisibility = Visibility.Visible ModifStartWndVM.SetVal(dAddLen) ModifStartWndVM.SetLeadOutType(LeadOutTypeId) ModifStartWndVM.SetLoTangDist(nTangDist) ModifStartWndVM.SetLoPerpDist(nPerpDist) If Not ModifStartWnd.ShowDialog() Then Return dWJAddLen = ModifStartWndVM.GetVal() nWJTangDist = ModifStartWndVM.GetLoTangDist() nWJPerpDist = ModifStartWndVM.GetLoPerpDist() nWJLeadInType = ModifStartWndVM.GetLeadOutType().Id bFirstWJ = False End If ' Modifica della lavorazione EgtSetCurrMachining(nOperId) EgtSetMachiningParam(MCH_MP.ENDADDLEN, dWJAddLen) EgtSetMachiningParam(MCH_MP.LEADOUTTYPE, nWJLeadInType) EgtSetMachiningParam(MCH_MP.LOTANG, nWJTangDist) EgtSetMachiningParam(MCH_MP.LOPERP, nWJPerpDist) UpdateMachiningPreview(m_MachiningList(nI).m_nId, True) ' verifico interferenza EgtVerifyMachining(m_MachiningList(nI).m_nId, m_MachiningList(nI).m_nInterf) ColorMachining(m_MachiningList(nI)) ColorNumberArrow(nI) bGenModif = True End If Next ' Se modificato qualcosa If bGenModif Then EgtDraw() m_bModified = True End If End Sub #End Region ' ModifEndCommand #Region "PauseCommand" Public ReadOnly Property PauseCommand As ICommand Get If m_cmdPause Is Nothing Then m_cmdPause = New Command(AddressOf Pause) End If Return m_cmdPause End Get End Property Public Sub Pause(ByVal param As Object) If m_CurrFirstInd = -1 Then Return For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind Dim nOperId As Integer = m_MachiningList(nI).m_nId If GetPause(nOperId) Then ResetPause(nOperId) m_MachiningList(nI).m_bPause = False RemovePauseText(m_ItemList(Index).Name) Else SetPause(nOperId) m_MachiningList(nI).m_bPause = True AddPauseText(m_ItemList(Index).Name) End If Next End Sub #End Region ' PauseCommand #Region "InvertCommand" #End Region ' InvertComman Public ReadOnly Property InvertCommand As ICommand Get If m_cmdInvert Is Nothing Then m_cmdInvert = New Command(AddressOf Invert) End If Return m_cmdInvert End Get End Property Public Sub Invert(ByVal param As Object) If m_CurrFirstInd = -1 Then Return For Index = m_CurrFirstInd To m_CurrLastInd If Not m_ItemList(Index).IsSelected Then Continue For End If Dim nI As Integer = m_ItemList(Index).Ind ' Si possono invertire solo i tagli di lama If m_MachiningList(nI).m_nType <> MCH_OY.SAWING Then Continue For ' Non si possono invertire i tagli di lama inclinati If Math.Abs(m_MachiningList(nI).m_dSideAng) > 0.1 Then Continue For ' Se abilitata inversione automatica e quindi non invertito If m_MachiningList(nI).m_bEnableInvert Then ' Inverto e disabilito inversione automatica If CamAuto.InvertVerticalCut(m_MachiningList(nI).m_nId) Then m_MachiningList(nI).m_bInvert = True m_MachiningList(nI).m_vtDir = -m_MachiningList(nI).m_vtDir m_MachiningList(nI).m_bEnableInvert = False SwapStartEndData(nI) ResetEnableInvert(m_MachiningList(nI).m_nEntId) EgtErase(m_MachiningList(nI).m_nArrId) NumberDirectionMachining(nI, False) EgtDraw() End If ' se altrimenti disabilitata inversione automatica e invertito ElseIf m_MachiningList(nI).m_bInvert Then ' Tolgo inversione e lascio disabilitazione inv. autom. If CamAuto.InvertVerticalCut(m_MachiningList(nI).m_nId) Then m_MachiningList(nI).m_bInvert = False m_MachiningList(nI).m_vtDir = -m_MachiningList(nI).m_vtDir SwapStartEndData(nI) EgtErase(m_MachiningList(nI).m_nArrId) NumberDirectionMachining(nI, False) EgtDraw() End If ' altrimenti disabilitata inversione automatica e non invertito Else ' Abilito inversione automatica e lascio non invertito m_MachiningList(nI).m_bEnableInvert = True SetEnableInvert(m_MachiningList(nI).m_nEntId) EgtErase(m_MachiningList(nI).m_nArrId) NumberDirectionMachining(nI, False) EgtDraw() End If Next End Sub #End Region ' COMMANDS #Region "EVENTS" Friend Sub OnMouseDownScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) ' Verifico di essere il gestore attivo e non in modalità sola visualizzazione If Not m_bActive OrElse OmagOFFICEMap.refMachiningTabVM.IsShow Then Return ' Si può selezionare solo con il tasto sinistro e se stato NULL If e.Button <> Windows.Forms.MouseButtons.Left Or Not OmagOFFICEMap.refSceneHostVM.MainScene.IsStatusNull() Then Return End If ' Reset drag m_nDragInd = -1 m_nDragType = 0 ' Reset selection interface m_nSelected = GDB_ID.NULL ' Verifico se selezionato estremo di taglio con lama EgtSetObjFilterForSelWin(False, True, False, False, False) Dim nSel As Integer EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel) Dim nId As Integer = EgtGetFirstObjInSelWin() While nId <> GDB_ID.NULL ' Verifico sia un attacco o uscita di taglio con lama Dim nType As Integer = 0 Dim sName As String = "" EgtGetName(nId, sName) If String.Compare(sName, NAME_PV_PRECUT) = 0 Then nType = 1 ElseIf String.Compare(sName, NAME_PV_POSTCUT) = 0 Then nType = 2 ElseIf String.Compare(sName, NAME_PV_CUT) = 0 Then nType = 3 End If If nType = 1 Or nType = 2 Then Dim nPvId As Integer = EgtGetParent(EgtGetParent(nId)) Dim nMchId As Integer = GDB_ID.NULL If EgtGetInfo(nPvId, "MId", nMchId) Then For nInd As Integer = 0 To m_MachiningList.Count() - 1 If m_MachiningList(nInd).m_nId = nMchId Then m_nDragInd = nInd m_nDragType = nType End If For nJ As Integer = 0 To m_MachiningList(nInd).m_vOthId.Count() - 1 If m_MachiningList(nInd).m_vOthId(nJ) = nMchId Then m_nDragInd = nInd m_nDragType = nType Exit For End If Next If m_nDragInd >= 0 Then ' Assegno l'id dell'elemento selezionato m_nSelected = m_nDragInd Exit For End If Next End If If m_nDragInd >= 0 Then ' Assegno l'id dell'elemento selezionato m_nSelected = m_nDragInd Exit While End If ElseIf nType = 3 Then Dim nPvId As Integer = EgtGetParent(EgtGetParent(nId)) Dim nMchId As Integer = GDB_ID.NULL If EgtGetInfo(nPvId, "MId", nMchId) Then For nInd As Integer = 0 To m_MachiningList.Count() - 1 If m_MachiningList(nInd).m_nId = nMchId Then m_nSelected = nInd End If For nJ As Integer = 0 To m_MachiningList(nInd).m_vOthId.Count() - 1 If m_MachiningList(nInd).m_vOthId(nJ) = nMchId Then m_nSelected = nInd Exit For End If Next If m_nSelected >= 0 Then Exit For Next End If If m_nSelected >= 0 Then Exit While End If nId = EgtGetNextObjInSelWin() End While ' Sistemazioni per drag If m_nSelected >= 0 AndAlso EgtUnProjectPoint(e.Location, m_ptDragPrev) Then Dim nItemIndex = 0 For Each Item In ItemList Item.IsSelected = (nItemIndex = m_nSelected) nItemIndex += 1 Next Else m_nDragInd = -1 m_nDragType = 0 m_nSelected = GDB_ID.NULL End If End Sub Friend Sub OnMyMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) ' Verifico di essere il gestore attivo e non in modalità sola visualizzazione If Not m_bActive OrElse OmagOFFICEMap.refMachiningTabVM.IsShow Then Return ' Se drag non abilitato o in corso If m_nDragInd = -1L Or m_bDragging Then Return m_bDragging = True Dim nOperId As Integer = m_MachiningList(m_nDragInd).m_nId ' Ricavo il punto corrente in coordinate mondo Dim ptCurr As Point3d EgtUnProjectPoint(e.Location, ptCurr) ' Ricavo il vettore di movimento e la variazione di lunghezza Dim vtMove As Vector3d = ptCurr - m_ptDragPrev Dim dDelta = vtMove * m_MachiningList(m_nDragInd).m_vtDir If m_nDragType = 1 Then Dim dOrigUsal As Double = 0 Dim dUsal As Double ' ----------------------- REPEAT ----------------------- Do dDelta = -dDelta ' Leggo il valore salvato nella geometria EgtGetInfo(nOperId, INFO_MCH_USER_SAL, dOrigUsal) dUsal = dOrigUsal + dDelta ' Se c'è limite alla lunghezza libera If m_MachiningList(m_nDragInd).m_dStartFreeLen < FREELEN_INF Then ' Recupero sicurezza in corner interno Dim dCornerSafety As Double = Math.Max(GetPrivateProfileDouble(S_MACH_NEST, K_MACH_SAFE_LEN_INTCORNER, 1, CurrentMachine.sMachIniFile), 10 * EPS_SMALL) ' Recupero lunghezza baffo del taglio Dim nPvId As Integer = GDB_ID.NULL EgtGetInfo(EgtGetFirstNameInGroup(nOperId, NAME_PREVIEW), INFO_PV_ONPART_ID, nPvId) Dim dDT As Double = 0 EgtGetInfo(EgtGetFirstGroupInGroup(nPvId), "DT", dDT) dUsal = Math.Min(dUsal, m_MachiningList(m_nDragInd).m_dStartFreeLen - dDT - dCornerSafety) End If ' Modifica della lavorazione EgtSetCurrMachining(nOperId) Dim dAddLen As Double = 0 EgtGetMachiningParam(MCH_MP.STARTADDLEN, dAddLen) If dAddLen - dOrigUsal < -10 * EPS_SMALL Then m_bDragging = False Return End If EgtSetMachiningParam(MCH_MP.STARTADDLEN, dAddLen + dUsal - dOrigUsal) EgtSetInfo(nOperId, INFO_MCH_USER_SAL, dUsal) Loop Until UpdateMachiningPreview(m_MachiningList(m_nDragInd).m_nId, True) ' ----------------------- REPEAT (solo se il segmento scompare) ----------------------- Else Dim dOrigUeal As Double = 0 Dim dUeal As Double dDelta = -dDelta Do dDelta = -dDelta ' Leggo il valore salvato nella geometria EgtGetInfo(nOperId, INFO_MCH_USER_EAL, dOrigUeal) dUeal = dOrigUeal + dDelta ' Se c'è limite alla lunghezza libera If m_MachiningList(m_nDragInd).m_dEndFreeLen < FREELEN_INF Then ' Recupero sicurezza in corner interno Dim dCornerSafety As Double = Math.Max(GetPrivateProfileDouble(S_MACH_NEST, K_MACH_SAFE_LEN_INTCORNER, 1, CurrentMachine.sMachIniFile), 10 * EPS_SMALL) ' Recupero lunghezza baffo del taglio Dim nPvId As Integer = GDB_ID.NULL EgtGetInfo(EgtGetFirstNameInGroup(nOperId, NAME_PREVIEW), INFO_PV_ONPART_ID, nPvId) Dim dDT As Double = 0 EgtGetInfo(EgtGetFirstGroupInGroup(nPvId), "DT", dDT) dUeal = Math.Min(dUeal, m_MachiningList(m_nDragInd).m_dEndFreeLen - dDT - dCornerSafety) End If ' Modifica della lavorazione EgtSetCurrMachining(nOperId) Dim dAddLen As Double = 0 EgtGetMachiningParam(MCH_MP.ENDADDLEN, dAddLen) If dAddLen - dOrigUeal < -10 * EPS_SMALL Then m_bDragging = False Return End If EgtSetMachiningParam(MCH_MP.ENDADDLEN, dAddLen + dUeal - dOrigUeal) EgtSetInfo(nOperId, INFO_MCH_USER_EAL, dUeal) Loop Until UpdateMachiningPreview(m_MachiningList(m_nDragInd).m_nId, True) End If ' verifico interferenza EgtVerifyMachining(m_MachiningList(m_nDragInd).m_nId, m_MachiningList(m_nDragInd).m_nInterf) ColorMachining(m_MachiningList(m_nDragInd)) ColorNumberArrow(m_nDragInd) ' Aggiorno visualizzazione EgtDraw() m_bModified = True ' Aggiorno punto e stato di drag m_ptDragPrev = ptCurr m_bDragging = False End Sub Friend Sub OnMyMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) ' Verifico di essere il gestore attivo e non in modalità sola visualizzazione If Not m_bActive OrElse OmagOFFICEMap.refMachiningTabVM.IsShow Then Return ' Se drag in corso If m_nDragInd >= 0 Then m_nDragInd = -1 End If End Sub #End Region ' EVENTS '----------------------------------------------------------------------------------------------- Public Class NameIdLsBxItem Inherits VMBase Private m_nInd As Integer Private m_sName As String Private m_bIsActive As Boolean Private m_nType As Integer Public Property Ind As Integer Get Return m_nInd End Get Set(value As Integer) m_nInd = value End Set End Property Public Property Name As String Get Return m_sName End Get Set(value As String) If value <> m_sName Then m_sName = value NotifyPropertyChanged("Name") End If End Set End Property Public Property bIsActive As Boolean Get Return m_bIsActive End Get Set(value As Boolean) If value <> m_bIsActive Then m_bIsActive = value NotifyPropertyChanged("bIsActive") End If End Set End Property Private m_IsSelected As Boolean Public Property IsSelected As Boolean Get Return m_IsSelected End Get Set(value As Boolean) If Not IsNothing(value) Then m_IsSelected = value If value AndAlso Not OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Contains(Me) Then OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Add(Me) Else OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Remove(Me) End If ' se non è stato aggiunto nessun nuovo elemento alla lista dei selezionati allora esco If OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Count = 0 Then EgtDraw() NotifyPropertyChanged("IsSelected") Return End If ' se ho un solo elemento allora so che è coerrente con se stesso come lavorazione If OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Count = 1 Then OmagOFFICEMap.refSplitModeVM.m_bAreHomogeneous = True End If ' creo lista ordinata dei selezionati Dim ItemList As New List(Of NameIdLsBxItem) For Each Item In OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList ItemList.Add(Item) Next ' ------------------------ verifico che le lavorazioni siano dello stesso tipo ------------------------ OmagOFFICEMap.refSplitModeVM.VerifyHomogenousMachining(ItemList) ' ----------------------------------------------------------------------------------------------------- ' riordino l'elenco delle lavorazioni ItemList.Sort(Function(x, y) Comparer(Of Integer).Default.Compare(OmagOFFICEMap.refSplitModeVM.m_ItemList.IndexOf(x), OmagOFFICEMap.refSplitModeVM.m_ItemList.IndexOf(y))) ' ------------------------ verifico che le lavorazioni siano contigue --------------------------------- OmagOFFICEMap.refSplitModeVM.bEnabledCommandMove = VerifyContinuity(ItemList) ' ----------------------------------------------------------------------------------------------------- 'If Not My.Computer.Keyboard.ShiftKeyDown And (My.Computer.Keyboard.CtrlKeyDown And value) Then ' ' verifico che siano contigui ' Dim bContigus As Boolean = False ' Dim LastSel As NameIdLsBxItem = OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList(OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Count - 1) ' If OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Count = 1 Then ' bContigus = True ' Else ' For Each Item In ItemList ' If Item.Ind = LastSel.Ind + 1 Or Item.Ind = LastSel.Ind - 1 Then ' bContigus = True ' End If ' Next ' End If ' ' se non contiguo, elimino dai selezionati il primo(che è l'ultimo ad essere stato selezionato) ' If Not bContigus Then ' ItemList.Remove(LastSel) ' OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.RemoveAt(OmagOFFICEMap.refSplitModeVM.m_SelectedItemsList.Count - 1) ' OmagOFFICEMap.refSplitModeVM.ItemList(LastSel.Ind).IsSelected = Not value 'm_IsSelected = Not value ' ' disabilito il pulsanti per spostare le lavorazioni ' End If 'End If ' resetto marcatura lavorazioni If OmagOFFICEMap.refSplitModeVM.m_CurrFirstInd > -1 Then For Index = OmagOFFICEMap.refSplitModeVM.m_CurrFirstInd To OmagOFFICEMap.refSplitModeVM.m_CurrLastInd OmagOFFICEMap.refSplitModeVM.MarkMachining(OmagOFFICEMap.refSplitModeVM.m_ItemList(Index).Ind, False) Next End If ' resetto indici OmagOFFICEMap.refSplitModeVM.m_CurrFirstInd = -1 OmagOFFICEMap.refSplitModeVM.m_CurrLastInd = -1 ' marco lavorazioni selezionate For Each Item In ItemList OmagOFFICEMap.refSplitModeVM.MarkMachining(Item.Ind, True) Next If (ItemList.Count > 0) Then OmagOFFICEMap.refSplitModeVM.m_CurrFirstInd = OmagOFFICEMap.refSplitModeVM.m_ItemList.IndexOf(ItemList(0)) OmagOFFICEMap.refSplitModeVM.m_CurrLastInd = OmagOFFICEMap.refSplitModeVM.m_ItemList.IndexOf(ItemList(ItemList.Count - 1)) End If EgtDraw() NotifyPropertyChanged("IsSelected") End If End Set End Property Public Function VerifyContinuity(ItemList As List(Of NameIdLsBxItem)) As Boolean If ItemList.Count < 2 Then Return True Dim bContigus As Boolean = False For Index As Integer = 0 To ItemList.Count - 2 If ItemList(Index).Ind = ItemList(Index + 1).Ind + 1 Or ItemList(Index).Ind = ItemList(Index + 1).Ind - 1 Then bContigus = True Else bContigus = False Exit For End If Next Return bContigus End Function Public Property Type As Integer Get Return m_nType End Get Set(value As Integer) m_nType = value End Set End Property Sub New(Name As String, Ind As Integer, bIsActive As Boolean, nType As Integer) Me.m_sName = Name Me.m_nInd = Ind Me.m_bIsActive = bIsActive Me.m_nType = nType End Sub End Class End Class