Imports EgtWPFLib5 Imports EgtUILib Public Class NestingTabVM Inherits VMBase #Region "FIELDS & PROPERTIES" ' Flag per pezzi selezionati in tavola o fuori Private m_nPartPos As Integer = PART_POS.NONE_TABLE Enum PART_POS As Integer IN_TABLE = -1 NONE_TABLE = 0 OUT_TABLE = 1 End Enum ' Identificativi per pezzo da selezionare/deselezionare Private m_nIdToSel As Integer = GDB_ID.NULL Private m_nIdToDesel As Integer = GDB_ID.NULL ' Dati del grezzo Private m_dMinDist As Double = 0 ' Dati movimento Private m_dMaxStep As Double = 0 ' Dati per Drag Private m_nRestRadius As Integer = 3 Private m_bDrag As Boolean = False Private m_bDragToStart As Boolean = False Private m_bVerify As Boolean = False Private m_bFromParking As Boolean = False Private m_bDragging As Boolean = False Private m_locPrev As System.Drawing.Point Private m_ptPrev As Point3d Private m_vtTotMove As Vector3d Private m_dSnapDist As Double = 0 ' Abilitazioni TrfData e CsvData Private m_bTrfData As Boolean = False Private m_bCsvData As Boolean = False Private m_CsvImportWindow As CsvWindowV Friend ReadOnly Property CsvImportWindow As CsvWindowV Get Return m_CsvImportWindow End Get End Property Private m_CsvImport_IsChecked As Boolean Public Property CsvImport_IsChecked As Boolean Get Return m_CsvImport_IsChecked End Get Set(value As Boolean) If value <> m_CsvImport_IsChecked Then m_CsvImport_IsChecked = value If m_CsvImport_IsChecked Then m_CsvImportWindow = New CsvWindowV(Application.Current.MainWindow, New CsvWindowVM) m_CsvImportWindow.Show() Else m_CsvImportWindow.Close() m_CsvImportWindow = Nothing End If NotifyPropertyChanged("CsvImport_IsChecked") End If End Set End Property Private m_MaxMoveIsChecked As Boolean Public Property MaxMoveIsChecked As Boolean Get Return m_MaxMoveIsChecked End Get Set(value As Boolean) If value <> m_MaxMoveIsChecked Then m_MaxMoveIsChecked = value NotifyPropertyChanged("MaxMoveIsChecked") End If End Set End Property Private m_dStepMove As Double Public Property StepMove As String Get Return LenToString(m_dStepMove, 2) End Get Set(value As String) Dim dValue As Double 'StringToLen(value, m_dStepMove) If StringToLen(value, dValue) Then If dValue < 0 Then dValue = 0 ElseIf dValue > 1000 Then dValue = 1000 End If m_dStepMove = dValue WriteMainPrivateProfileString(S_NEST, K_STEP, DoubleToString(m_dStepMove, 2)) End If NotifyPropertyChanged("StepMove") End Set End Property Private m_dRotationAngle As Double Public Property RotationAngle As String Get Return DoubleToString(m_dRotationAngle, 2) End Get Set(value As String) Dim dValue As Double 'StringToDouble(value, m_dRotationAngle) If StringToLen(value, dValue) Then If dValue < 0 Then dValue = 0 ElseIf dValue > 180 Then dValue = 180 End If m_dRotationAngle = dValue WriteMainPrivateProfileString(S_NEST, K_ANGSTEP, DoubleToString(m_dRotationAngle, 2)) End If NotifyPropertyChanged("RotationAngle") End Set End Property Private m_bMagnetic As Boolean Public Property MagneticIsChecked As Boolean Get Return m_bMagnetic End Get Set(value As Boolean) If value <> m_bMagnetic Then m_bMagnetic = value NotifyPropertyChanged("MagneticIsChecked") End If End Set End Property Private m_CsvData_Visibility As Visibility = Visibility.Collapsed Public Property CsvData_Visibility As Visibility Get Return m_CsvData_Visibility End Get Set(value As Visibility) m_CsvData_Visibility = value NotifyPropertyChanged( "CsvData_Visibility") End Set End Property #Region "Messages" Public ReadOnly Property InsertPartMsg As String Get Return EgtMsg(MSG_NESTPAGEUC + 1) End Get End Property Public ReadOnly Property StorePartMsg As String Get Return EgtMsg(MSG_NESTPAGEUC + 2) End Get End Property Public ReadOnly Property RemovePartMsg As String Get Return EgtMsg(MSG_NESTPAGEUC + 3) End Get End Property Public ReadOnly Property SelectAllMsg As String Get Return EgtMsg(MSG_NESTPAGEUC + 4) End Get End Property Public ReadOnly Property DeselectAllMsg As String Get Return EgtMsg(MSG_NESTPAGEUC + 5) End Get End Property Public ReadOnly Property ResetMsg As String Get Return EgtMsg(MSG_NESTPAGEUC + 6) End Get End Property Public ReadOnly Property CsvDataMsg As String Get Return EgtMsg( 90398) 'Dati Csv End Get End Property #End Region ' Messages ' Definizione comandi Private m_cmdDraw As ICommand Private m_cmdImportDxf As ICommand Private m_cmdPartRotOn As ICommand Private m_cmdPartRotOff As ICommand Private m_cmdUp As ICommand Private m_cmdLeft As ICommand Private m_cmdRight As ICommand Private m_cmdDown As ICommand Private m_cmdCClockwiseRot As ICommand Private m_cmdClockwiseRot As ICommand Private m_cmdInsertPart As ICommand Private m_cmdStorePart As ICommand Private m_cmdRemovePart As ICommand Private m_cmdSelectAll As ICommand Private m_cmdDeselectAll As ICommand Private m_cmdReset As ICommand Private m_cmdCsvData As ICommand #End Region ' FIELDS & PROPERTIES #Region "CONSTRUCTOR" Sub New() ' Creo riferimento a questa classe in OmagOFFICEMap OmagOFFICEMap.SetRefNestingTabVM(Me) End Sub #End Region ' CONSTRUCTOR #Region "METHODS" Friend Function InitNesting() As Boolean ' Se previsto, abilito bottone VeinMatching If Not IsNothing( OmagOFFICEMap.refMainWindowVM.VeinMatchingWnd) Then OmagOFFICEMap.refVeinMatchPanelVM.VeinMatchIsEnabled = True End If ' Abilitazione TrfData m_bTrfData = OmagOFFICEMap.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.TRF_IMPORT) And (GetMainPrivateProfileInt(S_COMPO, K_TRFDATA, 0) <> 0) ' Abilitazione CsvData m_bCsvData = Not m_bTrfData And (GetMainPrivateProfileInt(S_COMPO, K_CSVDATA, 0) <> 0) ' Se previsto, abilito bottone CsvData CsvData_Visibility = If( m_bCsvData, Visibility.Visible, Visibility.Collapsed) ' Imposto il corretto contesto EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' aggiorno dati del grezzo EstCalc.UpdateRawPart() ' calcolo valore di minima distanza (da spessore lama corrente) Dim dSawThick As Double = 0 If EgtTdbSetCurrTool(CurrentMachine.sCurrSaw) AndAlso EgtTdbGetCurrToolParam(MCH_TP.THICK, dSawThick) Then m_dMinDist = dSawThick Else EgtOutLog("Not found current saw for nesting mindist") m_dMinDist = 0 End If ' carico e calcolo i parametri di movimento e drag m_dStepMove = GetMainPrivateProfileDouble(S_NEST, K_STEP, 10) NotifyPropertyChanged("StepMove") Dim ptRawDiag As Vector3d = GetRawPtMax() - GetRawPtMin() m_dMaxStep = Math.Max(ptRawDiag.x, ptRawDiag.y) m_dRotationAngle = GetMainPrivateProfileDouble(S_NEST, K_ANGSTEP, 15) NotifyPropertyChanged("RotationAngle") m_nRestRadius = GetMainPrivateProfileInt(S_NEST, K_RESTRADIUS, 3) m_dSnapDist = GetMainPrivateProfileDouble(S_NEST, K_SNAPDIST, 50) ' Garantisco visibilità pezzi parcheggiati EstCalc.ShowParkedParts() ' Garantisco visibilità eventuale contorno da foto EstPhoto.ShowContour(True) ' Se abilitato CSV ne visualizzo la finestra If m_CsvImport_IsChecked Then m_CsvImportWindow = New CsvWindowV(Application.Current.MainWindow, New CsvWindowVM) m_CsvImportWindow.Show() End If EgtZoom(ZM.ALL) Return True End Function Private Sub StandardInsert() EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) Dim bWrongTrf As Boolean = False OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() ' Ciclo di inserimento in tavola dei pezzi selezionati Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Recupero successivo selezionato Dim nNextId = EgtGetNextSelectedObj() ' Se pezzo da Trf, verifico compatibilità If Not VerifyTrfData(nId) Then bWrongTrf = True EgtSetStatus(nId, GDB_ST.ON_) ' Passo al successivo selezionato nId = nNextId Continue While End If ' Lo metto in tavola, se possibile If EstCalc.InsertOnePart(nId, CurrentMachine.bAligned, CurrentMachine.bReducedCut) Then ' Eventuale notifica al VeinMatching VeinMatching.OnInsertPartInRaw(nId) Else VeinMatching.OnDeselectPart(nId) End If ' Costringo ad aggiornare UI UpdateUI() ' Passo al successivo selezionato nId = nNextId End While ' Aggiorno flag selezionati m_nPartPos = If(EgtGetSelectedObjCount() > 0, PART_POS.IN_TABLE, PART_POS.NONE_TABLE) ' Aggiorno vista EgtZoom(ZM.ALL) ' Eventuale segnalazione di pezzi Trf non adatti If bWrongTrf Then ' Pezzi con spessore, materiale o finitura non compatibili OmagOFFICEMap.refStatusBarVM.SetOutputMessage(EgtMsg(MSG_NESTPAGEUC + 7), MSG_TYPE.WARNING) End If End Sub Private Sub AutomaticInsert() EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) OmagOFFICEMap.refStatusBarVM.SetOutputMessage( EgtMsg( 90340)) ' Nesting Automatico in corso Dim bWrongTrf As Boolean = False Dim vParts As New List(Of Integer) ' Ciclo di pre-inserimento in tavola dei pezzi selezionati Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Recupero successivo selezionato Dim nNextId = EgtGetNextSelectedObj() ' Se pezzo da Trf, verifico compatibilità If Not VerifyTrfData(nId) Then bWrongTrf = True EgtSetStatus(nId, GDB_ST.ON_) ' Passo al successivo selezionato nId = nNextId Continue While End If ' Lo preparo in tavola, se possibile If PreInsertOnePart(nId) Then vParts.Add( nId) Else EgtSetStatus(nId, GDB_ST.ON_) VeinMatching.OnDeselectPart(nId) End If ' Costringo ad aggiornare UI UpdateUI() ' Passo al successivo selezionato nId = nNextId End While ' Aggiorno le regioni per il nesting UpdateNestRegions() Dim bAligned As Boolean = (GetPrivateProfileInt(S_MACH_NEST, K_MACH_NEST_ALIGNED, 0, CurrentMachine.sMachIniFile) <> 0) EnableReferenceRegion(bAligned) ' Eseguo nesting automatico Dim bOpimizeOnX As Boolean = ( GetMainPrivateProfileInt( S_NEST, K_AUTOMATICOPTIMIZE, 2) = 1) Dim bGuillotineMode As Boolean = bAligned Dim nAutomaticMaxTime As Integer = GetMainPrivateProfileInt( S_NEST, K_AUTOMATICMAXTIME, 20) Dim dPartTime As Double = If( bGuillotineMode, 1.0, 0.5) Dim nMaxTime As Integer = Math.Min( CInt( 2 + dPartTime * vParts.Count()), nAutomaticMaxTime) EgtAutomaticPackParts( vParts, bOpimizeOnX, CurrentMachine.bReducedCut, bGuillotineMode, nMaxTime) ' Sistemo i pezzi For Each nPartId As Integer In vParts ' se pezzo inserito If nPartId > 0 Then VeinMatching.OnInsertPartInRaw(nPartId) ' Eventuale aggiunta solido per taglio da sotto UpdateSolidForDrip(nPartId) ' altrimenti rifiutato else ' Ripristino lo stato originale PreRemoveOnePart( Math.Abs( nPartId)) VeinMatching.OnDeselectPart( Math.Abs( nPartId)) End If Next ' Aggiorno flag selezionati m_nPartPos = If(EgtGetSelectedObjCount() > 0, PART_POS.IN_TABLE, PART_POS.NONE_TABLE) ' Aggiorno vista EgtZoom(ZM.ALL) OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() ' Eventuale segnalazione di pezzi Trf non adatti If bWrongTrf Then ' Pezzi con spessore, materiale o finitura non compatibili OmagOFFICEMap.refStatusBarVM.SetOutputMessage(EgtMsg(MSG_NESTPAGEUC + 7), MSG_TYPE.WARNING) End If End Sub Private Function RotateCluster(ByVal dAngRotDeg As Double) As Boolean ' Se non ci sono pezzi selezionati, esco If EgtGetSelectedObjCount() = 0 Then Return True ' Se pezzi in parcheggio, li ruoto liberamente e li risistemo (sempre possibile) If m_nPartPos <> PART_POS.IN_TABLE Then Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Se pezzo con rotazione libera If Not EgtExistsInfo( nId, INFO_PARTROT) Then ' Calcolo il centro di rotazione come centro del pezzo Dim ptCen As Point3d If Not EgtGetPartPartClusterCenterGlob(nId, ptCen) Then Return False ' Rotazione del pezzo attorno al suo centro EgtRotate(nId, ptCen, Vector3d.Z_AX(), dAngRotDeg, GDB_RT.GLOB) ' Sistemazione nel parcheggio PackPartInStore(nId) End If ' Passo al successivo selezionato nId = EgtGetNextSelectedObj() End While Return True ' Altrimenti li ruoto tenendo conto delle collisioni Else ' Verifico se ci sono dei pezzi bloccati in rotazione Dim bLockedRot As Boolean = GetLockOnRotation( GDB_ID.SEL) ' Se tutti i pezzi possono ruotare If Not bLockedRot Then ' Calcolo il centro di rotazione come centro del cluster Dim ptCen As Point3d If Not EgtGetPartPartClusterCenterGlob(GDB_ID.SEL, ptCen) Then Return False ' Aggiorno regioni per nesting UpdateNestRegions() EnableReferenceRegion(False) ' Verifico rotazione complessiva EgtRotate(GDB_ID.SEL, ptCen, Vector3d.Z_AX(), dAngRotDeg, GDB_RT.GLOB) If EgtVerifyPart(GDB_ID.SEL, CurrentMachine.bReducedCut) Then Return True ' Provo rotazione parziale (dopo aver annullato la complessiva) EgtRotate(GDB_ID.SEL, ptCen, Vector3d.Z_AX(), -dAngRotDeg, GDB_RT.GLOB) Return EgtRotatePart(GDB_ID.SEL, CurrentMachine.bReducedCut, ptCen, dAngRotDeg) Else Return False End If End If End Function Private Function GetLockOnRotation( nPartId As Integer) As Boolean ' Se singolo pezzo If nPartId <> GDB_ID.SEL Then Return EgtExistsInfo( nPartId, INFO_PARTROT) ' Altrimenti tutti i selezionati Else Dim bLockedRot As Boolean = False Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL If EgtExistsInfo( nId, INFO_PARTROT) Then bLockedRot = True Exit While End If nId = EgtGetNextSelectedObj() End While Return bLockedRot End If End Function Friend Sub Refresh(PrevMeasureUnit As MeasureUnitOpt) NotifyPropertyChanged("StepMove") End Sub Friend Function SelectPart(nPartId As Integer, bNotifyVM As Boolean, ByRef nOtherMgrpId As Integer) As Boolean EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Determino se pezzo in tavola, in parcheggio o in altro gruppo Dim bPartInTable As Boolean = (EgtGetParent(nPartId) = EstCalc.GetRawId()) Dim bPartFree As Boolean = PartIsFree(nPartId) ' Se ci sono pezzi già selezionati nella posizione opposta, restituisco selezione non possibile If (bPartInTable And m_nPartPos = PART_POS.OUT_TABLE) Or (bPartFree And m_nPartPos = PART_POS.IN_TABLE) Then nOtherMgrpId = GDB_ID.NULL Return False End If ' Se il pezzo appartiene ad un altro gruppo di lavoro, restituisco selezione non possibile If Not bPartInTable And Not bPartFree Then nOtherMgrpId = EstCalc.GetPartMachGroup(nPartId) Return False End If ' Eseguo la selezione EgtSelectObj(nPartId) ' Eventuale aggiornamento VeinMatching If bNotifyVM Then VeinMatching.OnSelectPart(nPartId) ' Set flag posizione selezionati m_nPartPos = If(bPartInTable, PART_POS.IN_TABLE, PART_POS.OUT_TABLE) ' Selezione effettuata EgtDraw() Return True End Function Friend Function DeselectPart(nPartId As Integer, bNotifyVM As Boolean) As Boolean EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Eseguo la deselezione EgtDeselectObj(nPartId) ' Eventuale aggiornamento VeinMatching If bNotifyVM Then VeinMatching.OnDeselectPart(nPartId) ' Se nessun pezzo selezionato, reset flag posizione selezionati If EgtGetSelectedObjCount() = 0 Then m_nPartPos = PART_POS.NONE_TABLE ' Deselezione effettuata EgtDraw() Return True End Function Friend Function DeselectAllParts(bNotifyVM As Boolean) As Boolean EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Eseguo EgtDeselectAll() ' Eventuale notifica al VeinMatching If bNotifyVM Then VeinMatching.OnDeselectAll() ' Imposto flag posizione pezzi m_nPartPos = PART_POS.NONE_TABLE Return True End Function Friend Function ExitNesting( bChange As Boolean) As Boolean If m_CsvImport_IsChecked Then m_CsvImportWindow.Close() m_CsvImportWindow = Nothing End If If bChange Then OmagOFFICEMap.refVeinMatchPanelVM.SetVeinMatchIsChecked( False) OmagOFFICEMap.refVeinMatchPanelVM.VeinMatchIsEnabled = False End If Return True End Function #End Region ' METHODS #Region "COMMANDS" #Region "DrawCommand" Public ReadOnly Property DrawCommand As ICommand Get If m_cmdDraw Is Nothing Then m_cmdDraw = New Command(AddressOf Draw) End If Return m_cmdDraw End Get End Property Public Sub Draw(ByVal param As Object) Dim CompoWindow As New CompoWindowV(Application.Current.MainWindow, New CompoWindowVM) CompoWindow.Height = 700 CompoWindow.ShowDialog() EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) End Sub #End Region ' DrawCommand #Region "ImportDxfCommand" Public ReadOnly Property ImportDxfCommand As ICommand Get If m_cmdImportDxf Is Nothing Then m_cmdImportDxf = New Command(AddressOf ImportDxf) End If Return m_cmdImportDxf End Get End Property Public Sub ImportDxf(ByVal param As Object) Dim DxfImportWindow As New DxfImportWindowV(Application.Current.MainWindow, New DxfImportWindowVM) DxfImportWindow.ShowDialog() EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) End Sub #End Region ' ImportDxfCommand #Region "PartRotOnCommand" Public ReadOnly Property PartRotOnCommand As ICommand Get If m_cmdPartRotOn Is Nothing Then m_cmdPartRotOn = New Command(AddressOf PartRotOn) End If Return m_cmdPartRotOn End Get End Property Public Sub PartRotOn(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Se non ci sono pezzi selezionati o non sono in parcheggio, esco If EgtGetSelectedObjCount() = 0 OrElse m_nPartPos <> PART_POS.OUT_TABLE Then Return ' Tolgo blocco rotazione sui pezzi selezionati Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Se rotazione bloccata, tolgo blocco e aggiorno info If EgtExistsInfo( nId, INFO_PARTROT) Then ' Rimuovo flag di rotazione bloccata EgtRemoveInfo( nId, INFO_PARTROT) ' Tolgo da info sul pezzo Codice Dim nTextId As Integer = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nId, NAME_REGION)) While nTextId <> GDB_ID.NULL If EgtGetType( nTextId) = GDB_TY.EXT_TEXT Then Dim sText As String = "" EgtTextGetContent( nTextId, sText) sText = sText.Replace( "
(X)", "") EgtModifyText( nTextId, sText) Exit While End If nTextId = EgtGetNext( nTextId) End While End If ' Passo al successivo selezionato nId = EgtGetNextSelectedObj() End While ' Aggiorno visualizzazione EgtDraw() End Sub #End Region ' PartRotOnCommand #Region "PartRotOffCommand" Public ReadOnly Property PartRotOffCommand As ICommand Get If m_cmdPartRotOff Is Nothing Then m_cmdPartRotOff = New Command(AddressOf PartRotOff) End If Return m_cmdPartRotOff End Get End Property Public Sub PartRotOff(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Se non ci sono pezzi selezionati o non sono in parcheggio, esco If EgtGetSelectedObjCount() = 0 OrElse m_nPartPos <> PART_POS.OUT_TABLE Then Return ' Metto blocco rotazione sui pezzi selezionati Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Se rotazione libera, applico blocco e aggiorno info If Not EgtExistsInfo( nId, INFO_PARTROT) Then ' Imposto flag di rotazione bloccata EgtSetInfo( nId, INFO_PARTROT, 0) ' Inserisco in info sul pezzo Codice Dim nTextId As Integer = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nId, NAME_REGION)) While nTextId <> GDB_ID.NULL If EgtGetType( nTextId) = GDB_TY.EXT_TEXT Then Dim sText As String = "" EgtTextGetContent( nTextId, sText) sText &= "
(X)" EgtModifyText( nTextId, sText) Exit While End If nTextId = EgtGetNext( nTextId) End While End If ' Passo al successivo selezionato nId = EgtGetNextSelectedObj() End While ' Aggiorno visualizzazione EgtDraw() End Sub #End Region ' PartRotOffCommand #Region "UpCommand" Public ReadOnly Property UpCommand As ICommand Get If m_cmdUp Is Nothing Then m_cmdUp = New Command(AddressOf Up) End If Return m_cmdUp End Get End Property Public Sub Up(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Aggiorno regioni per nesting UpdateNestRegions() EnableReferenceRegion(False) ' eseguo movimento Dim dStep As Double = If(m_MaxMoveIsChecked, m_dMaxStep, m_dStepMove) EgtMovePart(GDB_ID.SEL, CurrentMachine.bReducedCut, New Vector3d(0, dStep, 0)) EgtSaveCollInfo() ' se abilitato magnetico (allineamento + snap), lo provo Dim bAlignMoved As Boolean = False Dim bSnapMoved As Boolean = False If m_bMagnetic Then If Not GetLockOnRotation( GDB_ID.SEL) Then EgtAlignPartOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, bAlignMoved) End If If m_dSnapDist > EPS_SMALL Then EgtRestoreCollInfo() EgtMovePartToSnapPointOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, m_dSnapDist, bSnapMoved) End If End If EstCalc.ResetOrderMachiningFlag() EgtDraw() ' Eventuale notifica al VeinMatching Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While End Sub #End Region ' UpCommand #Region "LeftCommand" Public ReadOnly Property LeftCommand As ICommand Get If m_cmdLeft Is Nothing Then m_cmdLeft = New Command(AddressOf Left) End If Return m_cmdLeft End Get End Property Public Sub Left(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Aggiorno regioni per nesting UpdateNestRegions() EnableReferenceRegion(False) ' eseguo movimento Dim dStep As Double = If(m_MaxMoveIsChecked, m_dMaxStep, m_dStepMove) EgtMovePart(GDB_ID.SEL, CurrentMachine.bReducedCut, New Vector3d(-dStep, 0, 0)) EgtSaveCollInfo() ' se abilitato magnetico (allineamento + snap), lo provo Dim bAlignMoved As Boolean = False Dim bSnapMoved As Boolean = False If m_bMagnetic Then If Not GetLockOnRotation( GDB_ID.SEL) Then EgtAlignPartOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, bAlignMoved) End If If m_dSnapDist > EPS_SMALL Then EgtRestoreCollInfo() EgtMovePartToSnapPointOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, m_dSnapDist, bSnapMoved) End If End If EstCalc.ResetOrderMachiningFlag() EgtDraw() ' Eventuale notifica al VeinMatching Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While End Sub #End Region ' LeftCommand #Region "RightCommand" Public ReadOnly Property RightCommand As ICommand Get If m_cmdRight Is Nothing Then m_cmdRight = New Command(AddressOf Right) End If Return m_cmdRight End Get End Property Public Sub Right(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Aggiorno regioni per nesting UpdateNestRegions() EnableReferenceRegion(False) ' eseguo movimento Dim dStep As Double = If(m_MaxMoveIsChecked, m_dMaxStep, m_dStepMove) EgtMovePart(GDB_ID.SEL, CurrentMachine.bReducedCut, New Vector3d(dStep, 0, 0)) EgtSaveCollInfo() ' se abilitato magnetico (allineamento + snap), lo provo Dim bAlignMoved As Boolean = False Dim bSnapMoved As Boolean = False If m_bMagnetic Then If Not GetLockOnRotation( GDB_ID.SEL) Then EgtAlignPartOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, bAlignMoved) End If If m_dSnapDist > EPS_SMALL Then EgtRestoreCollInfo() EgtMovePartToSnapPointOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, m_dSnapDist, bSnapMoved) End If End If EstCalc.ResetOrderMachiningFlag() EgtDraw() ' Eventuale notifica al VeinMatching Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While End Sub #End Region ' RightCommand #Region "DownCommand" Public ReadOnly Property DownCommand As ICommand Get If m_cmdDown Is Nothing Then m_cmdDown = New Command(AddressOf Down) End If Return m_cmdDown End Get End Property Public Sub Down(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Aggiorno regioni per nesting UpdateNestRegions() EnableReferenceRegion(False) ' eseguo movimento Dim dStep As Double = If(m_MaxMoveIsChecked, m_dMaxStep, m_dStepMove) EgtMovePart(GDB_ID.SEL, CurrentMachine.bReducedCut, New Vector3d(0, -dStep, 0)) EgtSaveCollInfo() ' se abilitato magnetico (allineamento + snap), lo provo Dim bAlignMoved As Boolean = False Dim bSnapMoved As Boolean = False If m_bMagnetic Then If Not GetLockOnRotation( GDB_ID.SEL) Then EgtAlignPartOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, bAlignMoved) End If If m_dSnapDist > EPS_SMALL Then EgtRestoreCollInfo() EgtMovePartToSnapPointOnCollision(GDB_ID.SEL, CurrentMachine.bReducedCut, m_dSnapDist, bSnapMoved) End If End If EstCalc.ResetOrderMachiningFlag() EgtDraw() ' Eventuale notifica al VeinMatching Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While End Sub #End Region ' DownCommand #Region "CClockwiseRotCommand" Public ReadOnly Property CClockwiseRotCommand As ICommand Get If m_cmdCClockwiseRot Is Nothing Then m_cmdCClockwiseRot = New Command(AddressOf CClockwiseRot) End If Return m_cmdCClockwiseRot End Get End Property Public Sub CClockwiseRot(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) RotateCluster(m_dRotationAngle) EstCalc.ResetOrderMachiningFlag() EgtDraw() ' Eventuale notifica al VeinMatching Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While End Sub #End Region ' CClockwiseRotCommand #Region "ClockwiseRotCommand" Public ReadOnly Property ClockwiseRotCommand As ICommand Get If m_cmdClockwiseRot Is Nothing Then m_cmdClockwiseRot = New Command(AddressOf ClockwiseRot) End If Return m_cmdClockwiseRot End Get End Property Public Sub ClockwiseRot(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) RotateCluster(-m_dRotationAngle) EstCalc.ResetOrderMachiningFlag() EgtDraw() ' Eventuale notifica al VeinMatching Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While End Sub #End Region ' ClockwiseRotCommand #Region "InsertPartCommand" Public ReadOnly Property InsertPartCommand As ICommand Get If m_cmdInsertPart Is Nothing Then m_cmdInsertPart = New Command(AddressOf InsertPart) End If Return m_cmdInsertPart End Get End Property Public Sub InsertPart(ByVal param As Object) ' Se inserimento automatico If CurrentMachine.bAutomatic And OmagOFFICEMap.refMainWindowVM.MainWindowM.AutoNestOption() Then AutomaticInsert() ' altrimenti inserimento standard Else StandardInsert() End If End Sub #End Region ' InsertPartCommand #Region "StorePartCommand" Public ReadOnly Property StorePartCommand As ICommand Get If m_cmdStorePart Is Nothing Then m_cmdStorePart = New Command(AddressOf StorePart) End If Return m_cmdStorePart End Get End Property Public Sub StorePart(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Ciclo di parcheggio dei pezzi selezionati Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Recupero indice del successivo Dim nNextId As Integer = EgtGetNextSelectedObj() ' Metto in parcheggio, se in grezzo EstCalc.StoreOnePart(nId) ' Eventuale notifica al VeinMatching VeinMatching.OnRemovePartFromRaw(nId) ' Passo al successivo selezionato nId = nNextId End While ' Imposto flag posizione pezzi su parcheggio m_nPartPos = PART_POS.OUT_TABLE ' Aggiorno vista EgtZoom(ZM.ALL) End Sub #End Region ' StorePartCommand #Region "RemovePartCommand" Public ReadOnly Property RemovePartCommand As ICommand Get If m_cmdRemovePart Is Nothing Then m_cmdRemovePart = New Command(AddressOf RemovePart) End If Return m_cmdRemovePart End Get End Property Public Sub RemovePart() EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Se non ci sono pezzi selezionati, esco subito If EgtGetFirstSelectedObj() = GDB_ID.NULL Then Return ' Chiedo conferma prima di procedere If MessageBox.Show(EgtMsg(MSG_EGTMSGBOX + 21), "", MessageBoxButton.OKCancel, MessageBoxImage.Question) = MessageBoxResult.Cancel Then Return EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Verifico se ci sono pezzi provenienti da liste Csv Dim bCsvParts As Boolean = False Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL If EgtExistsInfo(nId, INFO_CSV_PATH) Then bCsvParts = True Exit While End If nId = EgtGetNextSelectedObj() End While ' Chiedo se si vogliono cancellare anche questi pezzi Dim bEraseCsvParts As Boolean = False If bCsvParts Then ' Vuoi cancellare anche i pezzi da lista Csv ? Select Case MessageBox.Show(EgtMsg(MSG_EGTMSGBOX + 12), "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) Case MessageBoxResult.Cancel Return Case MessageBoxResult.Yes bEraseCsvParts = True Case MessageBoxResult.No bEraseCsvParts = False End Select EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) End If ' Ciclo di cancellazione dei pezzi selezionati nId = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL ' Recupero indice del successivo Dim nNextId = EgtGetNextSelectedObj() ' Se abilitata cancellazione in ogni caso o pezzo non da Csv If bEraseCsvParts OrElse Not EgtExistsInfo(nId, INFO_CSV_PATH) Then ' Se pezzo in parcheggio cancello direttamente If EgtIsPart(nId) Then ' Eventuale notifica al VeinMatching VeinMatching.OnRemovePart(nId, False) ' Rimuovo le lavorazioni EraseMachinings(nId) ' Cancello EgtErase(nId) ' Altrimenti pezzo nel grezzo ElseIf EgtGetParent(nId) = EstCalc.GetRawId() Then If EgtRemovePartFromRawPart(nId) Then ' Eventuale notifica al VeinMatching VeinMatching.OnRemovePart(nId, False) ' Rimuovo le lavorazioni EraseMachinings(nId) 'Cancello EgtErase(nId) End If End If End If ' Passo al successivo selezionato nId = nNextId End While ' Imposto flag posizione pezzi m_nPartPos = PART_POS.NONE_TABLE ' Aggiorno viste EgtZoom(ZM.ALL) VeinMatching.Draw() End Sub #End Region ' RemovePartCommand #Region "SelectAllCommand" Public ReadOnly Property SelectAllCommand As ICommand Get If m_cmdSelectAll Is Nothing Then m_cmdSelectAll = New Command(AddressOf SelectAll) End If Return m_cmdSelectAll End Get End Property Public Sub SelectAll(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Numero dei pezzi in tavola Dim nPartTab As Integer = EgtGetPartInRawPartCount(GetRawId()) ' Se già selezionati in tavola o non ci sono selezionati e pezzi in tavola If m_nPartPos = PART_POS.IN_TABLE Or (m_nPartPos = PART_POS.NONE_TABLE And nPartTab > 0) Then ' Seleziono tutti i pezzi in tavola Dim nPartId As Integer = EgtGetFirstGroupInGroup(GetRawId()) While nPartId <> GDB_ID.NULL EgtSelectObj(nPartId) VeinMatching.OnSelectPart(nPartId, False) nPartId = EgtGetNextGroup(nPartId) End While ' Aggiorno flag m_nPartPos = If(EgtGetSelectedObjCount() > 0, PART_POS.IN_TABLE, PART_POS.NONE_TABLE) ' Altrimenti Else ' Seleziono tutti i pezzi in parcheggio Dim nPartId As Integer = EgtGetFirstPart() While nPartId <> GDB_ID.NULL If PartIsFree(nPartId) Then EgtSelectObj(nPartId) VeinMatching.OnSelectPart(nPartId, False) End If nPartId = EgtGetNextPart(nPartId) End While End If ' Aggiorno viste EgtDraw() VeinMatching.Draw() End Sub #End Region ' SelectAllCommand #Region "DeselectAllCommand" Public ReadOnly Property DeselectAllCommand As ICommand Get If m_cmdDeselectAll Is Nothing Then m_cmdDeselectAll = New Command(AddressOf DeselectAll) End If Return m_cmdDeselectAll End Get End Property Public Sub DeselectAll(ByVal param As Object) DeselectAllParts(True) ' Aggiorno vista EgtDraw() End Sub #End Region ' DeselectAllCommand #Region "ResetCommand" Public ReadOnly Property ResetCommand As ICommand Get If m_cmdReset Is Nothing Then m_cmdReset = New Command(AddressOf Reset) End If Return m_cmdReset End Get End Property Public Sub Reset(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Cancello eventuali messaggi OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() ' Cancello tutte le lavorazioni CamAuto.EraseMachinings(GDB_ID.NULL) ' Reinserisco tutte le lavorazioni piane CamAuto.AddMachinings(GDB_ID.NULL) ' Aggiorno visualizzazione EgtDraw() End Sub #End Region ' ResetCommand #Region "CsvDataCommand" Public ReadOnly Property CsvDataCommand As ICommand Get If m_cmdCsvData Is Nothing Then m_cmdCsvData = New Command(AddressOf CsvData) End If Return m_cmdCsvData End Get End Property Public Sub CsvData(ByVal param As Object) EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) ' Cancello eventuali messaggi OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() ' Cerco il primo pezzo selezionato Dim nPartId As Integer = EgtGetFirstSelectedObj() If nPartId = GDB_ID.NULL Then Return ' Deseleziono eventuali altri If EgtGetNextSelectedObj() <> GDB_ID.NULL Then EgtDeselectAll() EgtSelectObj( nPartId) EgtDraw() End If ' Recupero dati del pezzo Dim sCsvOrder As String = "" : EgtGetInfo( nPartId, INFO_CSV_ORD, sCsvOrder) Dim sCsvList As String = "" : EgtGetInfo( nPartId, INFO_CSV_DIST, sCsvList) Dim sCsvName As String = "" : EgtGetInfo( nPartId, INFO_CSV_PART, sCsvName) ' Avvio dialogo modifica Dim DlgCsvDataVM As New CompoCsvDataWindowVM() Dim DlgCsvDataV As New CompoCsvDataWindowV(Application.Current.MainWindow, DlgCsvDataVM) DlgCsvDataVM.SetData( sCsvOrder, sCsvList, sCsvName) If DlgCsvDataV.ShowDialog() Then ' Recupero i nuovi dati Dim sNewOrder As String = "" Dim sNewList As String = "" Dim sNewName As String = "" DlgCsvDataVM.GetData( sNewOrder, sNewList, sNewName) ' Assegno i nuovi dati EgtSetInfo( nPartId, INFO_CSV_ORD, sNewOrder) EgtSetInfo( nPartId, INFO_CSV_DIST, sNewList) EgtSetInfo( nPartId, INFO_CSV_PART, sNewName) ' Se necessario, modifico la scritta If sNewName <> sCsvName Then Dim nRegLayId As Integer = EgtGetFirstNameInGroup( nPartId, NAME_REGION) Dim nTextId = EgtGetFirstInGroup(nRegLayId) While nTextId <> GDB_ID.NULL If EgtGetType( nTextId) = GDB_TY.EXT_TEXT Then Dim sText As String = String.Empty EgtTextGetContent( nTextId, sText) Dim nPos As Integer = sText.IndexOf( sCsvName) Dim sNewText As String If nPos < 0 Then sNewText = sNewName & "
" & sText Else sNewText = sText.Remove( nPos, sCsvName.Length()).Insert( nPos, sNewName) End If EgtModifyText( nTextId, sNewText) VeinMatching.ModifyPartText( nPartId, sNewText) Exit While End If nTextId = EgtGetNext(nTextId) End While End If End If ' Aggiorno visualizzazione EgtDraw() End Sub #End Region ' CsvDataCommand #End Region ' COMMANDS #Region "EVENTS" Friend Sub OnMouseDownScene(sender As Object, e As Windows.Forms.MouseEventArgs) ' Per default no drag m_bDrag = False ' Verifico se selezionato indicativo di pezzo EgtSetObjFilterForSelWin(True, True, True, True, True) Dim nSel As Integer EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel) Dim nId As Integer = EgtGetFirstObjInSelWin() While nId <> GDB_ID.NULL ' Recupero l'identificativo del pezzo cui appartiene Dim nPartId As Integer = EgtGetParent(EgtGetParent(nId)) Dim bPartInTable As Boolean = (EgtGetParent(nPartId) = GetRawId()) If EgtIsPart(nPartId) Or bPartInTable Then Dim nStat As Integer = GDB_ST.ON_ EgtGetStatus(nPartId, nStat) ' Se già selezionato If nStat = GDB_ST.SEL Then ' Memorizzo Id da deselezionare m_nIdToDesel = nPartId Else ' Memorizzo Id da selezionare m_nIdToSel = nPartId End If ' Drag possibile m_bDrag = True Exit While End If nId = EgtGetNextObjInSelWin() End While ' Dati per drag m_locPrev = e.Location m_bDrag = m_bDrag AndAlso EgtUnProjectPoint(e.Location, m_ptPrev) m_bDragToStart = m_bDrag m_bVerify = m_bDrag AndAlso (Keyboard.Modifiers And ModifierKeys.Shift) > 0 m_vtTotMove = Vector3d.NULL() End Sub Friend Sub OnMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) ' Se drag non abilitato o già in esecuzione, esco If Not m_bDrag Or m_bDragging Then Return ' Se primo movimento di drag, verifico di aver superato la soglia di movimento in pixel If m_bDragToStart Then If Math.Abs(e.Location.X - m_locPrev.X) < m_nRestRadius And Math.Abs(e.Location.Y - m_locPrev.Y) < m_nRestRadius Then Return End If m_bDragToStart = False End If ' Determino cosa muovere Dim nMoveId = If(m_nIdToSel <> GDB_ID.NULL, m_nIdToSel, GDB_ID.SEL) ' Verifico se in tavola o in parcheggio Dim nTestId = If(nMoveId <> GDB_ID.SEL, nMoveId, EgtGetFirstSelectedObj()) If EgtGetParent(nTestId) <> GetRawId() Then ' Dal parcheggio ammesso drag di un singolo pezzo If nMoveId = GDB_ID.SEL Then Return ' Se pezzo Trf, verifico compatibilità If Not VerifyTrfData(nTestId) Then ' Pezzi con spessore, materiale o finitura non compatibili OmagOFFICEMap.refStatusBarVM.SetOutputMessage(EgtMsg(MSG_NESTPAGEUC + 7), MSG_TYPE.WARNING) End If ' Applico le lavorazioni al pezzo Dim b3Curr As new BBox3d EgtGetBBoxGlob( EgtGetFirstNameInGroup(nTestId, NAME_REGION), BBFLAG, b3Curr) if Not EstCalc.PreInsertOnePart( nTestId) Then Return Dim b3Ins As new BBox3d EgtGetBBoxGlob( EgtGetFirstNameInGroup( nTestId, NAME_REGION), BBFLAG, b3Ins) Dim vtDiff As new Vector3d( b3Curr.Min().x - b3Ins.Min().x, b3Curr.Min().y - b3Ins.Min().y, 0) EgtMove( nMoveId, vtDiff) ' Gestione VeinMatching VeinMatching.OnInsertPartInRaw( nMoveId) ' Imposto stato m_bVerify = True m_bFromParking = True End If ' Inizio esecuzione di drag m_bDragging = True ' Ricavo il punto corrente in coordinate mondo Dim ptCurr As Point3d EgtUnProjectPoint(e.Location, ptCurr) ' Ricavo il vettore di movimento Dim vtMove As Vector3d = ptCurr - m_ptPrev ' Muovo i pezzi selezionati di quanto possibile If vtMove.SqLen() > EPS_SMALL * EPS_SMALL Then ' Se movimento con sola verifica finale If m_bVerify Then EgtMove(nMoveId, vtMove) m_vtTotMove += vtMove ' altrimenti caso con verifica durante il movimento Else ' Aggiorno regioni per nesting UpdateNestRegions() EnableReferenceRegion(False) ' muovo il pezzo EgtMovePart(nMoveId, CurrentMachine.bReducedCut, vtMove) EgtSaveCollInfo() ' se movimento risultante nullo, provo con movimento tangente Dim bTgMoved As Boolean = False If vtMove.IsSmall() Then ' riprovo con movimento tangente Dim vtTgMove As Vector3d = ptCurr - m_ptPrev EgtTgMovePartOnCollision(nMoveId, CurrentMachine.bReducedCut, vtTgMove) bTgMoved = (Not vtTgMove.IsSmall()) End If ' se abilitato magnetico (allineamento + snap), lo provo Dim bAlignMoved As Boolean = False Dim bSnapMoved As Boolean = False If m_bMagnetic Then If Not GetLockOnRotation( nMoveId) Then EgtAlignPartOnCollision(nMoveId, CurrentMachine.bReducedCut, bAlignMoved) End If If m_dSnapDist > EPS_SMALL Then EgtRestoreCollInfo() EgtMovePartToSnapPointOnCollision(nMoveId, CurrentMachine.bReducedCut, m_dSnapDist, bSnapMoved) End If End If EstCalc.ResetOrderMachiningFlag() End If EgtDraw() ' Eventuale notifica al VeinMatching If nMoveId = GDB_ID.SEL Then Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While Else VeinMatching.OnMovePartInRaw(nMoveId) End If End If ' Aggiorno il punto precedente m_ptPrev = ptCurr ' Terminata esecuzione di drag m_bDragging = False End Sub Friend Sub OnMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) ' Se eseguito drag If Not m_bDragToStart Then ' Se movimento con sola verifica finale If m_bVerify Then ' Determino cosa verificare Dim nMoveId = If(m_nIdToSel <> GDB_ID.NULL, m_nIdToSel, GDB_ID.SEL) ' Aggiorno regioni per nesting UpdateNestRegions() EnableReferenceRegion(False) ' Eseguo verifica If VerifyTrfData(nMoveId) And EgtVerifyPart(nMoveId, CurrentMachine.bReducedCut) Then EstCalc.ResetOrderMachiningFlag() ' Non superata riporto alla posizione iniziale Else If m_bFromParking Then OmagOFFICEMap.refStatusBarVM.ClearOutputMessage() PreRemoveOnePart(nMoveId) VeinMatching.OnRemovePartFromRaw(nMoveId) Else EgtMove(nMoveId, -m_vtTotMove) ' Eventuale notifica al VeinMatching If nMoveId = GDB_ID.SEL Then Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL VeinMatching.OnMovePartInRaw(nId) nId = EgtGetNextSelectedObj() End While Else VeinMatching.OnMovePartInRaw(nMoveId) End If End If End If m_bFromParking = False ' altrimenti caso con verifica durante il movimento Else ' Basta reset alla fine End If ' Se selezione da eseguire ElseIf m_nIdToSel <> GDB_ID.NULL Then ' Determino se pezzo in tavola o in parcheggio Dim bPartInTable As Boolean = (EgtGetParent(m_nIdToSel) = GetRawId()) ' Se ci sono pezzi già selezionati nella posizione opposta, li deseleziono If (bPartInTable And m_nPartPos = PART_POS.OUT_TABLE) Or (Not bPartInTable And m_nPartPos = PART_POS.IN_TABLE) Then EgtDeselectAll() ' Aggiornamento eventuale VeinMatching VeinMatching.OnDeselectAll() End If ' Eseguo la selezione EgtSelectObj(m_nIdToSel) ' Eventuale aggiornamento VeinMatching VeinMatching.OnSelectPart(m_nIdToSel) ' Set flag posizione selezionati m_nPartPos = If(bPartInTable, PART_POS.IN_TABLE, PART_POS.OUT_TABLE) ' Se deselezione da eseguire ElseIf m_nIdToDesel <> GDB_ID.NULL Then EgtDeselectObj(m_nIdToDesel) ' Eventuale aggiornamento VeinMatching VeinMatching.OnDeselectPart(m_nIdToDesel) End If ' Reset m_bDrag = False m_nIdToSel = GDB_ID.NULL m_nIdToDesel = GDB_ID.NULL ' Se nessun pezzo selezionato, reset flag posizione selezionati If EgtGetSelectedObjCount() = 0 Then m_nPartPos = PART_POS.NONE_TABLE End If EgtDraw() End Sub Friend Sub OnKeyDownScene(sender As Object, e As System.Windows.Forms.KeyEventArgs) ' Con CANC cancello i pezzi selezionati If e.KeyData = System.Windows.Forms.Keys.Delete Then RemovePart() ' Con INS eseguo inserimento dei pezzi selezionati in VeinMatching ElseIf e.KeyData = System.Windows.Forms.Keys.Insert Then ' Vettore dei pezzi selezionati (l'inserimento di un pezzo in VM cancella la selezione) Dim vSel As New List(Of Integer) Dim nTmp As Integer = EgtGetFirstSelectedObj() While nTmp <> GDB_ID.NULL vSel.Add(nTmp) nTmp = EgtGetNextSelectedObj() End While ' Ciclo di inserimento in VM dei pezzi selezionati For Each nId As Integer In vSel ' Se non è già inserito If Not VeinMatching.IsPartIn(nId) Then ' Lo copio in VM VeinMatching.SetRefOnPart(nId) VeinMatching.AddPart(nId, True) ' Se pezzo in lastra (ovvero non è un pezzo standard in parcheggio) If Not EgtIsPart(nId) Then VeinMatching.OnInsertPartInRaw(nId, False) End If ' Dichiaro progetto modificato EgtSetModified() End If Next ' Ripristino lo stato di selezione For Each nId As Integer In vSel EgtSelectObj(nId) VeinMatching.OnSelectPart(nId) Next End If End Sub #End Region ' EVENTS End Class