Files
omagoffice/OptionPanel/NestingTab/NestingTabVM.vb
T
Dario Sassi 7494e86397 OmagOFFICE :
- modifiche per libreria EgtSTONELib rinominata in EgtPHOTOLib.
2020-08-19 15:41:08 +00:00

1387 lines
51 KiB
VB.net

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)
StringToLen(value, m_dStepMove)
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)
StringToDouble(value, m_dRotationAngle)
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.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( "<br/>(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 &= "<br/>(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 & "<br/>" & sText
Else
sNewText = sText.Remove( nPos, sCsvName.Length()).Insert( nPos, sNewName)
End If
EgtModifyText( nTextId, 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
' 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 EgtVerifyPart(nMoveId, CurrentMachine.bReducedCut) Then
EstCalc.ResetOrderMachiningFlag()
' Non superata riporto alla posizione iniziale
Else
If m_bFromParking Then
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