7494e86397
- modifiche per libreria EgtSTONELib rinominata in EgtPHOTOLib.
1387 lines
51 KiB
VB.net
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
|