Imports System.Globalization Imports EgtUILib Imports EgtWPFLib Public Class RawPartPageUC ' Riferimento alla MainWindow Dim m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow) Dim WithEvents m_CurrProjPage As CurrentProjectPageUC Dim m_CurrentMachine As CurrentMachine = m_MainWindow.m_CurrentMachine ' Dichiarazione delle Page UserControl Friend m_MachineButtons As MachineButtonsUC ' Definizione pagina di scelta della lavorazione corrente Dim m_ChooseMachiningPage As ChooseMachining ' Flag di pagina attiva Private m_bActive As Boolean = False ' Tipo definizione rettangolo / per punti / laser / aree danneggiate Private m_ActiveRawMode As RAWMODE = RAWMODE.RECTANGLE ' Modalità operazione su punti grezzo Private m_nPtMode As PTMODE = PTMODE.MOVE ' Modalità operazione su punti aree danneggiate Private m_nPtDmgMode As DMGMODE = DMGMODE.NONE ' Dati per Drag Private m_bDrag As Boolean = False Private m_ptPrev As Point3d Private m_nDragEnt As Integer = -1 Private m_dDragPar As Double = 0 ' Colori standard Private m_RawCol As New Color3d(64, 192, 255, 40) Private m_KerfCol As New Color3d(255, 0, 0, 100) ' Dati tavola Private m_ptTableMin As Point3d Private m_dTableLength As Double = 0 Private m_dTableWidth As Double = 0 ' Dimensioni grezzo rettangolare Private m_RawLength As Double = 0 Private m_RawWidth As Double = 0 Private m_RawHeight As Double = 0 Private m_RawOffsX As Double = 0 Private m_RawOffsY As Double = 0 Private m_RawKerf As Double = 0 ' Layer per crocette temporanee Private m_nTempLay As Integer = GDB_ID.NULL ' Definizione lista modalità di definizione grezzo per ComboBox Private m_RawModeList(2) As String ' Variabile che indica la zona danneggiata selezionata Private m_nSelDmg As Integer ' Array per modalità per punti Private ByPointsModeArray As New List(Of StringIdCmBx) ' Id della curva composita Kerf definita con il laser Private m_nLaserKerfId As Integer = GDB_ID.NULL ' Primo punto acquisito Private m_bptLast As Boolean = False Private m_ptLast As Point3d = Point3d.ORIG ' Lista di linee che creeranno la curva composita Kerf Private m_CurveXKerfList As New List(Of Integer) ' Flag che indica se è in corso la definizione tramite laser o se il grezzo è già chiuso Private m_bIsRawDefiningByLaser As Boolean = False ' Costante minima dimensione del grezzo Private Const MIN_RAW_DIM As Double = 10 ' Costante distanza di sicurezza del grezzo dal bordo Private Const SAFE_RAW_DIST As Double = 5 ' Costante raggio cerchietto Private Const RAD_CIRCLE As Double = 30 ' Costanti modo operazione punti Private Enum PTMODE MOVE = 0 ADD = 1 REMOVE = 2 End Enum ' Costanti modo operazione zone danneggiate Private Enum DMGMODE NONE = 0 ADD = 1 REMOVE = 2 End Enum ' Costanti modalità di creazione grezzo Private Enum RAWMODE As Integer RECTANGLE = 0 BY_POINTS = 1 FROM_LASER = 2 DAMAGED = 3 End Enum Private Sub RawPartPage_Initialized(sender As Object, e As EventArgs) 'Creazione della Page UserControl e relative impostazioni m_MachineButtons = New MachineButtonsUC(True) m_MachineButtons.SetValue(Grid.ColumnProperty, 1) Me.LowerButtonGrid.Children.Add(m_MachineButtons) ' Associazione della lista materiali alla combobox MaterialsCmbx.ItemsSource = m_CurrentMachine.Materials ' Associazione tag textbox e label per visualizzare nome nella calcolatrice LengthTxBx.Tag = LengthTxBl WidthTxBx.Tag = WidthTxBl HeightTxBx.Tag = HeightTxBl OffsetXTxBx.Tag = OffsetXTxBl OffsetYTxBx.Tag = OffsetYTxBl KerfTxBx.Tag = KerfTxBl ' Creo list modalità di definizione del grezzo m_RawModeList(0) = EgtMsg(MSG_RAWPARTPAGEUC + 1) m_RawModeList(1) = EgtMsg(MSG_RAWPARTPAGEUC + 2) m_RawModeList(2) = EgtMsg(MSG_RAWPARTPAGEUC + 30) RawModeCmBx.ItemsSource = m_RawModeList ' Imposto i messaggi letti dal file dei messaggi OutlineBtn.Content = EgtMsg(MSG_RAWPARTPAGEUC + 33) 'Rectangle - Rettangolo DamagedBtn.Content = EgtMsg(MSG_RAWPARTPAGEUC + 10) 'By points - Per punti LengthTxBl.Text = EgtMsg(MSG_RAWPARTPAGEUC + 3) 'Length - Lunghezza WidthTxBl.Text = EgtMsg(MSG_RAWPARTPAGEUC + 4) 'Width - Larghezza HeightTxBl.Text = EgtMsg(MSG_RAWPARTPAGEUC + 5) 'Height - Spessore OffsetXTxBl.Text = EgtMsg(MSG_RAWPARTPAGEUC + 6) 'Offset X OffsetYTxBl.Text = EgtMsg(MSG_RAWPARTPAGEUC + 7) 'Offset Y KerfTxBl.Text = EgtMsg(MSG_RAWPARTPAGEUC + 8) 'Kerf MaterialGpBx.Header = EgtMsg(MSG_RAWPARTPAGEUC + 9) 'Material - Materiale DamagedAreaGpBx.Header = EgtMsg(MSG_RAWPARTPAGEUC + 10) 'Damaged area - Zona rovinata NewBtn.Content = EgtMsg(MSG_RAWPARTPAGEUC + 11) 'New - Nuovo DeleteBtn.Content = EgtMsg(MSG_RAWPARTPAGEUC + 12) 'Delete - Cancella PointsGpBx.Header = EgtMsg(MSG_RAWPARTPAGEUC + 13) 'Points - Punti AddBtn.Content = EgtMsg(MSG_RAWPARTPAGEUC + 14) 'Add - Aggiungi RemoveBtn.Content = EgtMsg(MSG_RAWPARTPAGEUC + 15) 'Remove - Rimuovi CloseBtn.Content = EgtMsg(MSG_RAWPARTPAGEUC + 31) 'Close - Chiudi End Sub Private Sub RawPartPage_Loaded(sender As Object, e As RoutedEventArgs) m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC m_bActive = True ' correggo differenza tra machinebuttons che ha 10 colonne e spazio disponibile solo per 9 facendolo sbordare(non si vede perchè la parte che avanza è vuota) m_MachineButtons.Width = LowerButtonGrid.ActualWidth / 12 * 10 ' Colori standard GetPrivateProfileColor(S_RAWPART, K_RAWCOLOR, m_RawCol, m_MainWindow.GetIniFile()) GetPrivateProfileColor(S_RAWPART, K_KERFCOLOR, m_KerfCol, m_MainWindow.GetIniFile()) ' Dimensioni tavola Dim ptMin, ptMax As Point3d If EgtGetTableArea(1, ptMin, ptMax) Then m_ptTableMin = ptMin m_dTableLength = ptMax.x - ptMin.x m_dTableWidth = ptMax.y - ptMin.y End If ' Origine tavola Dim ptRef1 As Point3d If EgtGetTableRef(1, ptRef1) Then If Not Point3d.SameApprox(m_ptTableMin, ptRef1) Then EgtOutLog("Error : TableMin e TableRef1 are different") End If End If ' Parcheggio pezzi presenti nel grezzo Dim nPartId As Integer = EgtGetFirstPartInRawPart(m_CurrProjPage.m_nRawId) While nPartId <> GDB_ID.NULL m_MainWindow.m_CadCutPageUC.m_NestPage.StoreOnePart(nPartId) nPartId = EgtGetFirstPartInRawPart(m_CurrProjPage.m_nRawId) End While ' Nascondo eventuali pezzi in parcheggio HideParkedParts() ' Deseleziono pezzi EgtDeselectAll() ' Cancello tutte le lavorazioni EraseMachinings(GDB_ID.NULL) ' Visualizzo eventuale foto m_MainWindow.m_CurrentProjectPageUC.ShowPhoto(True) Dim bHeightModified As Boolean = False ' Se esiste già il grezzo... Dim ptRawMin, ptRawMax As Point3d If GetRawBox(ptRawMin, ptRawMax) Then ' kerf EgtGetInfo(EgtGetFirstRawPart(), KEY_KERF, m_RawKerf) ' aggiorno dati grezzo m_RawLength = ptRawMax.x - ptRawMin.x - 2 * m_RawKerf m_RawWidth = ptRawMax.y - ptRawMin.y - 2 * m_RawKerf m_RawHeight = ptRawMax.z - ptRawMin.z m_RawOffsX = ptRawMin.x - m_ptTableMin.x + m_RawKerf m_RawOffsY = ptRawMin.y - m_ptTableMin.y + m_RawKerf ' aggiorno l'apparenza del grezzo AdjustRawPartOnStart() ' Altrimenti lo definisco Else ' Leggo da Ini gli ultimi valori m_RawLength = GetPrivateProfileDouble(S_RAWPART, K_RAWLENGTH, 2500, m_MainWindow.GetIniFile()) m_RawWidth = GetPrivateProfileDouble(S_RAWPART, K_RAWWIDTH, 1500, m_MainWindow.GetIniFile()) m_RawHeight = GetPrivateProfileDouble(S_RAWPART, K_RAWHEIGHT, 30, m_MainWindow.GetIniFile()) m_RawOffsX = GetPrivateProfileDouble(S_RAWPART, K_RAWOFFSX, 100, m_MainWindow.GetIniFile()) m_RawOffsY = GetPrivateProfileDouble(S_RAWPART, K_RAWOFFSY, 100, m_MainWindow.GetIniFile()) m_RawKerf = GetPrivateProfileDouble(S_RAWPART, K_RAWKERF, 50, m_MainWindow.GetIniFile()) ' Richiedo ricalcolo quota eventuale foto bHeightModified = True End If ' Assegno dati grezzo rettangolare ai textbox LengthTxBx.Text = LenToString(m_RawLength, 2) WidthTxBx.Text = LenToString(m_RawWidth, 2) HeightTxBx.Text = LenToString(m_RawHeight, 3) OffsetXTxBx.Text = LenToString(m_RawOffsX, 2) OffsetYTxBx.Text = LenToString(m_RawOffsY, 2) KerfTxBx.Text = LenToString(m_RawKerf, 2) ' Creo layer temporaneo per crocette m_nTempLay = EgtCreateGroup(GDB_ID.ROOT) EgtSetLevel(m_nTempLay, GDB_LV.TEMP) ' Determino modalità di definizione OutlineBtn.IsChecked = True If EgtExistsInfo(m_CurrProjPage.m_nRawId, KEY_RAWBYPOINTS) Then m_ActiveRawMode = RAWMODE.BY_POINTS RawModeCmBx.SelectedIndex = m_ActiveRawMode PointsGpBx.Visibility = Windows.Visibility.Visible CloseBtn.Visibility = Windows.Visibility.Hidden ' Visualizzo crocette UpdateCircles() EgtZoom(ZM.ALL) Else m_ActiveRawMode = RAWMODE.RECTANGLE RawModeCmBx.SelectedIndex = m_ActiveRawMode PointsGpBx.Visibility = Windows.Visibility.Hidden UpdateRawPart(bHeightModified) End If ' Imposto il materiale corrente nella combobox MaterialsCmbx.SelectedItem = m_CurrentMachine.CurrMat End Sub Private Sub OnMyMouseDownScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles m_CurrProjPage.OnMouseDownScene ' Verifico di essere il gestore attivo If Not m_bActive Then Return ' Si può selezionare solo con il tasto sinistro e se stato NULL If e.Button <> Windows.Forms.MouseButtons.Left Or Not m_CurrProjPage.CurrentProjectScene.IsStatusNull() Then Return End If ' Verifico cosa selezionato Dim nSolidId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_RAW_SOLID) Dim nKerfId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) EgtSetObjFilterForSelWin(True, True, True, True, True) Dim nSel As Integer EgtSelect(e.Location, 2 * Scene.DIM_SEL, 2 * Scene.DIM_SEL, nSel) ' Ricavo nome dell'entità selezionata e identificativo Dim nSelId As Integer = EgtGetFirstObjInSelWin() Dim sName As String = String.Empty While nSelId <> GDB_ID.NULL sName = String.Empty EgtGetName(nSelId, sName) If sName = NAME_RAW_SOLID Then m_bDrag = EgtUnProjectPoint(e.Location, m_ptPrev) m_nDragEnt = -1 m_dDragPar = -1 ElseIf sName = NAME_KERF And (m_ActiveRawMode = RAWMODE.RECTANGLE Or m_ActiveRawMode = RAWMODE.BY_POINTS) Then m_bDrag = EgtUnProjectPoint(e.Location, m_ptPrev) Dim dDist, dU As Double If Not EgtGetMinDistPointCurve(m_ptPrev.Loc(nKerfId), nKerfId, dDist, dU) Then m_bDrag = False End If m_nDragEnt = CInt(Math.Ceiling(dU)) m_dDragPar = dU ' Privilegio il kerf, pertanto esco Exit While ElseIf sName = NAME_DAMAGED And m_ActiveRawMode = RAWMODE.DAMAGED Then m_bDrag = EgtUnProjectPoint(e.Location, m_ptPrev) Dim dDist, dU As Double If Not EgtGetMinDistPointCurve(m_ptPrev.Loc(nSelId), nSelId, dDist, dU) Then m_bDrag = False End If m_nDragEnt = CInt(Math.Ceiling(dU)) m_dDragPar = dU m_nSelDmg = nSelId ' Aggiorno cerchi UpdateCircles() EgtDraw() ' Privilegio l'area danneggiata, pertanto esco Exit While End If nSelId = EgtGetNextObjInSelWin() End While ' se drag e modalità punti If m_bDrag And m_ActiveRawMode = RAWMODE.BY_POINTS Then ' se aggiungi punto If m_nPtMode = PTMODE.ADD Then If EgtAddCurveCompoJoint(nKerfId, m_dDragPar) Then m_dDragPar = Math.Ceiling(m_dDragPar) ' il grezzo non è cambiato, perchè il nuovo punto è sulla vecchia linea AddBtn.IsChecked = False m_nPtMode = PTMODE.MOVE ' Aggiorno cerchi UpdateCircles() EgtDraw() ' altrimenti Else ' verifico di essere abbastanza vicino ad un estremo Dim ptJoint As Point3d If Not EgtAtParamPoint(nKerfId, Math.Round(m_dDragPar), GDB_ID.ROOT, ptJoint) OrElse Point3d.SqDistXY(ptJoint, m_ptPrev) > RAD_CIRCLE * RAD_CIRCLE Then m_bDrag = False End If ' se rimuovi If m_bDrag And m_nPtMode = PTMODE.REMOVE Then ' ci devono essere almeno 4 punti If EgtGetCurveCompoJointCount(nKerfId) >= 4 Then EgtRemoveCurveCompoJoint(nKerfId, CInt(m_dDragPar)) ' aggiorno il solido del grezzo UpdateRawPartKerf() ' aggiorno l'ingombro e la posizione del grezzo UpdateRawXYData() ' Aggiorno cerchi UpdateCircles() EgtDraw() End If RemoveBtn.IsChecked = False m_nPtMode = PTMODE.MOVE m_bDrag = False End If End If ' se drag e modalità zona danneggiata ElseIf m_bDrag And m_ActiveRawMode = RAWMODE.DAMAGED Then ' se aggiungi zona rovinata If m_nPtDmgMode = DMGMODE.ADD Then AddNewDamagedArea() ' Aggiorno cerchi UpdateCircles() EgtDraw() ' se rimuovi zona rovinata ElseIf m_nPtDmgMode = DMGMODE.REMOVE Then ' Verifico di essere sulla zona danneggiata Dim ptNear As Point3d If EgtAtParamPoint(m_nSelDmg, m_dDragPar, GDB_ID.ROOT, ptNear) And Point3d.SqDistXY(ptNear, m_ptPrev) <= RAD_CIRCLE * RAD_CIRCLE Then RemoveDamagedArea() End If ' Aggiorno cerchi UpdateCircles() EgtDraw() ' altrimenti eventuali operazioni di punto Else ' se aggiungi punto If m_nPtMode = PTMODE.ADD Then If EgtAddCurveCompoJoint(m_nSelDmg, m_dDragPar) Then m_dDragPar = Math.Ceiling(m_dDragPar) ' il grezzo non è cambiato, perchè il nuovo punto è sulla vecchia linea AddBtn.IsChecked = False m_nPtMode = PTMODE.MOVE ' Aggiorno cerchi UpdateCircles() EgtDraw() ' altrimenti Else ' verifico di essere abbastanza vicino ad un estremo Dim ptJoint As Point3d If Not EgtAtParamPoint(m_nSelDmg, Math.Round(m_dDragPar), GDB_ID.ROOT, ptJoint) OrElse Point3d.SqDistXY(ptJoint, m_ptPrev) > RAD_CIRCLE * RAD_CIRCLE Then m_bDrag = False End If ' se rimuovi If m_bDrag And m_nPtMode = PTMODE.REMOVE Then ' ci devono essere almeno 4 punti If EgtGetCurveCompoJointCount(m_nSelDmg) >= 4 Then EgtRemoveCurveCompoJoint(m_nSelDmg, CInt(m_dDragPar)) ' aggiorno il solido del grezzo UpdateRawPartKerf() ' aggiorno l'ingombro e la posizione del grezzo UpdateRawXYData() ' Aggiorno cerchi UpdateCircles() EgtDraw() End If RemoveBtn.IsChecked = False m_nPtMode = PTMODE.MOVE m_bDrag = False End If End If End If End If End Sub Private Sub OnMyMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles m_CurrProjPage.OnMouseMoveScene ' Verifico di essere il gestore attivo If Not m_bActive Then Return ' Verifico di essere in modalità drag If Not m_bDrag Then Return ' Ricavo il punto corrente in coordinate mondo Dim ptCurr As Point3d EgtUnProjectPoint(e.Location, ptCurr) ' Eseguo modifica Select Case m_ActiveRawMode Case RAWMODE.RECTANGLE ModifyRectangle(ptCurr) Case RAWMODE.BY_POINTS ModifyGeneric(ptCurr) Case RAWMODE.DAMAGED ModifyDamaged(ptCurr) End Select ' Aggiorno il punto precedente m_ptPrev = ptCurr End Sub Private Sub ModifyRectangle(ptCurr As Point3d) ' Se movimento del grezzo If m_nDragEnt = -1 Then ' Ricavo il vettore di movimento (tengo solo XY) Dim vtMove As Vector3d = ptCurr - m_ptPrev vtMove.z = 0 ' Muovo il grezzo If EgtMoveRawPart(m_CurrProjPage.m_nRawId, vtMove) Then EgtDraw() ' Aggiorno gli offset m_RawOffsX += vtMove.x m_RawOffsY += vtMove.y OffsetXTxBx.Text = LenToString(m_RawOffsX, 2) OffsetYTxBx.Text = LenToString(m_RawOffsY, 2) End If ' se sposto lato sotto ElseIf m_nDragEnt = 1 Then Dim dDelta = ptCurr.y - m_ptPrev.y If m_RawWidth - dDelta > MIN_RAW_DIM And m_RawOffsY + dDelta > m_RawKerf Then m_RawWidth -= dDelta m_RawOffsY += dDelta EgtModifyRawPartSize(m_CurrProjPage.m_nRawId, m_RawLength + 2 * m_RawKerf, m_RawWidth + 2 * m_RawKerf, m_RawHeight) AdjustRawPartKerf() Dim vtMove As New Vector3d(0, dDelta, 0) EgtMoveRawPart(m_CurrProjPage.m_nRawId, vtMove) EgtDraw() WidthTxBx.Text = LenToString(m_RawWidth, 2) OffsetYTxBx.Text = LenToString(m_RawOffsY, 2) End If ' se sposto lato a destra ElseIf m_nDragEnt = 2 Then Dim dDelta = ptCurr.x - m_ptPrev.x If m_RawLength + dDelta > MIN_RAW_DIM And m_RawOffsX + m_RawLength + dDelta + m_RawKerf < m_dTableLength Then m_RawLength += dDelta EgtModifyRawPartSize(m_CurrProjPage.m_nRawId, m_RawLength + 2 * m_RawKerf, m_RawWidth + 2 * m_RawKerf, m_RawHeight) AdjustRawPartKerf() EgtDraw() LengthTxBx.Text = LenToString(m_RawLength, 2) End If ' se sposto lato sopra ElseIf m_nDragEnt = 3 Then Dim dDelta = ptCurr.y - m_ptPrev.y If m_RawWidth + dDelta > MIN_RAW_DIM And m_RawOffsY + m_RawWidth + dDelta + m_RawKerf < m_dTableWidth Then m_RawWidth += dDelta EgtModifyRawPartSize(m_CurrProjPage.m_nRawId, m_RawLength + 2 * m_RawKerf, m_RawWidth + 2 * m_RawKerf, m_RawHeight) AdjustRawPartKerf() EgtDraw() WidthTxBx.Text = LenToString(m_RawWidth, 2) End If ' se sposto lato a sinistra ElseIf m_nDragEnt = 4 Then Dim dDelta = ptCurr.x - m_ptPrev.x If m_RawLength - dDelta > MIN_RAW_DIM And m_RawOffsX + dDelta > m_RawKerf Then m_RawLength -= dDelta m_RawOffsX += dDelta EgtModifyRawPartSize(m_CurrProjPage.m_nRawId, m_RawLength + 2 * m_RawKerf, m_RawWidth + 2 * m_RawKerf, m_RawHeight) AdjustRawPartKerf() Dim vtMove As New Vector3d(dDelta, 0, 0) EgtMoveRawPart(m_CurrProjPage.m_nRawId, vtMove) EgtDraw() LengthTxBx.Text = LenToString(m_RawLength, 2) OffsetXTxBx.Text = LenToString(m_RawOffsX, 2) End If End If End Sub Private Sub ModifyGeneric(ptCurr As Point3d) ' Se non selezionata entità del kerf, esco If m_nDragEnt = -1 Then Return ' Limito il punto a stare nella tavola con franco pari al kerf If ptCurr.x < m_ptTableMin.x + m_RawKerf Then ptCurr.x = m_ptTableMin.x + m_RawKerf + SAFE_RAW_DIST If ptCurr.y < m_ptTableMin.y + m_RawKerf Then ptCurr.y = m_ptTableMin.y + m_RawKerf + SAFE_RAW_DIST If ptCurr.x > m_ptTableMin.x + m_dTableLength - m_RawKerf Then ptCurr.x = m_ptTableMin.x + m_dTableLength - m_RawKerf - SAFE_RAW_DIST If ptCurr.y > m_ptTableMin.y + m_dTableWidth - m_RawKerf Then ptCurr.y = m_ptTableMin.y + m_dTableWidth - m_RawKerf - SAFE_RAW_DIST ' Identificativo curva di kerf Dim nKerfId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) ' Identifico il punto Dim nU As Integer = CInt(m_dDragPar) ' Aggiusto Z punto movimentato (è in globale) ptCurr.z = m_ptTableMin.z + m_CurrentMachine.dAdditionalTable + m_RawHeight ' Sposto il punto If Not EgtModifyCurveCompoJoint(nKerfId, nU, ptCurr, GDB_RT.GLOB) Then Return ' Aggiorno il grezzo UpdateRawPartKerf() ' Aggiorno dimensioni e posizione grezzo UpdateRawXYData() ' Salvo il valore del kerf (sempre in mm) EgtSetInfo(m_CurrProjPage.m_nRawId, KEY_KERF, m_RawKerf) ' Aggiorno cerchi UpdateCircles() ' Aggiorno visualizzazione EgtDraw() End Sub Private Sub ModifyDamaged(ptCurr As Point3d) ' Se non selezionata entità, esco If m_nDragEnt = -1 Then Return ' Recupero Id kerf Dim nKerfId As Integer = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) ' Limito il punto a stare nel kerf Dim ptLocCurr As Point3d = ptCurr.Loc(nKerfId) Dim dMinDist As Double Dim ptLocMin As Point3d Dim nSide As Integer If EgtGetMinDistPntSidePointCurve(ptLocCurr, nKerfId, Vector3d.Z_AX, dMinDist, ptLocMin, nSide) And nSide = +1 Then ptCurr = ptLocMin.Glob(nKerfId) End If ' Identifico il punto Dim nU As Integer = CInt(m_dDragPar) ' Aggiusto Z punto movimentato (è in globale) ptCurr.z = m_ptTableMin.z + m_CurrentMachine.dAdditionalTable + m_RawHeight ' Sposto il punto If Not EgtModifyCurveCompoJoint(m_nSelDmg, nU, ptCurr, GDB_RT.GLOB) Then Return ' Aggiorno cerchi UpdateCircles() ' Aggiorno visualizzazione EgtDraw() End Sub Private Sub OnMyMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles m_CurrProjPage.OnMouseUpScene ' Verifico di essere il gestore attivo If Not m_bActive Then Return ' Disabilito modalità drag m_bDrag = False End Sub Private Sub MaterialsCmbx_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles MaterialsCmbx.SelectionChanged If Not IsNothing(MaterialsCmbx.SelectedItem) Then m_CurrentMachine.CurrMat = DirectCast(MaterialsCmbx.SelectedItem, Material) m_CurrProjPage.MaterialTxBx.Text = m_CurrentMachine.CurrMat.sName Else m_CurrentMachine.CurrMat = Nothing m_CurrProjPage.MaterialTxBx.Text = "Non definito" End If End Sub Private Sub OkBtn_Click(sender As Object, e As RoutedEventArgs) Handles OkBtn.Click If ExitRawPart(True) Then m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Remove(Me) m_CurrProjPage.CurrProjGrid.Visibility = Windows.Visibility.Visible If m_MainWindow.m_PrevActivePage = MainWindow.Pages.CadCut Then m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_MainWindow.m_CadCutPageUC) m_MainWindow.m_ActivePage = MainWindow.Pages.CadCut ElseIf m_MainWindow.m_PrevActivePage = MainWindow.Pages.DirectCut Then m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_MainWindow.m_DirectCutPageUC) m_MainWindow.m_ActivePage = MainWindow.Pages.DirectCut ElseIf m_MainWindow.m_PrevActivePage = MainWindow.Pages.FrameCut Then m_MainWindow.m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_MainWindow.m_FrameCutPageUC) m_MainWindow.m_ActivePage = MainWindow.Pages.FrameCut End If m_MainWindow.m_PrevActivePage = MainWindow.Pages.RawPart End If End Sub Friend Function ExitRawPart(bAskMachining As Boolean) As Boolean ' Sistemo grezzo da punti con laser macchina If m_ActiveRawMode = RAWMODE.FROM_LASER Then If m_bIsRawDefiningByLaser Then CloseRawByLaser() End If End If ' Apro pagina di selezione della lavorazione prima di chiudere il grezzo m_ChooseMachiningPage = New ChooseMachining(m_MainWindow) If m_ChooseMachiningPage.DialogResult Then ' Sistemo il grezzo AdjustRawPartOnExit() ' Imposto spessore del grezzo m_CurrProjPage.m_dRawHeight = GetRawHeight() m_CurrProjPage.UpdateHeightTxBx() ' Aggiorno lavorazione in interfaccia m_CurrProjPage.UpdateMachiningTxBx() ' Salvo nel file Ini le dimensioni del grezzo (sempre in mm) WritePrivateProfileString(S_RAWPART, K_RAWLENGTH, DoubleToString(m_RawLength, 2), m_MainWindow.GetIniFile()) WritePrivateProfileString(S_RAWPART, K_RAWWIDTH, DoubleToString(m_RawWidth, 2), m_MainWindow.GetIniFile()) WritePrivateProfileString(S_RAWPART, K_RAWHEIGHT, DoubleToString(m_RawHeight, 2), m_MainWindow.GetIniFile()) WritePrivateProfileString(S_RAWPART, K_RAWOFFSX, DoubleToString(m_RawOffsX, 2), m_MainWindow.GetIniFile()) WritePrivateProfileString(S_RAWPART, K_RAWOFFSY, DoubleToString(m_RawOffsY, 2), m_MainWindow.GetIniFile()) WritePrivateProfileString(S_RAWPART, K_RAWKERF, DoubleToString(m_RawKerf, 2), m_MainWindow.GetIniFile()) Return True Else Return False End If End Function Private Sub RawModeCmBx_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles RawModeCmBx.SelectionChanged Select Case RawModeCmBx.SelectedIndex Case 0 ' Rettangolo ' Se ero in modalità da laser VerifyLaserDefining() m_ActiveRawMode = RAWMODE.RECTANGLE ' Riattivo i controlli in base a quale modalità di inserimento contorni è attiva RawModeView() RemoveCircles() UpdateRawPart() Case 1 ' Punti ' Se ero in modalità da laser VerifyLaserDefining() m_ActiveRawMode = RAWMODE.BY_POINTS ' Riattivo i controlli in base a quale modalità di inserimento contorni è attiva RawModeView() UpdateCircles() EgtDraw() Case 2 ' Da laser m_ActiveRawMode = RAWMODE.FROM_LASER RemoveCircles() LoadFromMachine() ' Azzero lista e punto di partenza m_CurveXKerfList.Clear() m_bptLast = False ' Segno flag che indica definizione grezzo con laser in corso m_bIsRawDefiningByLaser = True ' Riattivo i controlli in base a quale modalità di inserimento contorni è attiva RawModeView() ' Disattivo il bottone CloseBtn.IsEnabled = False OkBtn.IsEnabled = False End Select End Sub Private Sub RawModeView() Select Case m_ActiveRawMode Case RAWMODE.RECTANGLE RawModeCmBx.IsEnabled = True LengthTxBx.IsEnabled = True WidthTxBx.IsEnabled = True OffsetXTxBx.IsEnabled = True OffsetYTxBx.IsEnabled = True PointsGpBx.Visibility = Windows.Visibility.Hidden ' Disattivo bottoni zone rovinate DamagedAreaGpBx.Visibility = Windows.Visibility.Hidden Case RAWMODE.BY_POINTS RawModeCmBx.IsEnabled = True LengthTxBx.IsEnabled = False WidthTxBx.IsEnabled = False OffsetXTxBx.IsEnabled = False OffsetYTxBx.IsEnabled = False ' Visualizzo bottoni per disegno PointsGpBx.Visibility = Windows.Visibility.Visible PointsGpBx.SetValue(Grid.RowSpanProperty, 1) AddBtn.SetValue(Grid.RowSpanProperty, 2) RemoveBtn.SetValue(Grid.RowSpanProperty, 2) CloseBtn.Visibility = Windows.Visibility.Hidden ' Disattivo bottoni zone rovinate DamagedAreaGpBx.Visibility = Windows.Visibility.Hidden Case RAWMODE.FROM_LASER RawModeCmBx.IsEnabled = True LengthTxBx.IsEnabled = False WidthTxBx.IsEnabled = False OffsetXTxBx.IsEnabled = False OffsetYTxBx.IsEnabled = False ' Visualizzo bottoni per laser PointsGpBx.Visibility = Windows.Visibility.Visible PointsGpBx.SetValue(Grid.RowSpanProperty, 2) AddBtn.SetValue(Grid.RowSpanProperty, 1) RemoveBtn.SetValue(Grid.RowSpanProperty, 1) CloseBtn.Visibility = Windows.Visibility.Visible ' Disattivo bottoni zone rovinate DamagedAreaGpBx.Visibility = Windows.Visibility.Hidden Case RAWMODE.DAMAGED RawModeCmBx.IsEnabled = False LengthTxBx.IsEnabled = False WidthTxBx.IsEnabled = False OffsetXTxBx.IsEnabled = False OffsetYTxBx.IsEnabled = False ' Visualizzo bottoni per laser PointsGpBx.Visibility = Windows.Visibility.Visible PointsGpBx.SetValue(Grid.RowSpanProperty, 1) RemoveBtn.SetValue(Grid.ColumnSpanProperty, 3) AddBtn.SetValue(Grid.RowSpanProperty, 2) RemoveBtn.SetValue(Grid.RowSpanProperty, 2) CloseBtn.Visibility = Windows.Visibility.Hidden ' Attivo bottoni zone rovinate DamagedAreaGpBx.Visibility = Windows.Visibility.Visible End Select End Sub Private Sub OutlineBtn_Click(sender As Object, e As RoutedEventArgs) Handles OutlineBtn.Click If m_ActiveRawMode = RAWMODE.DAMAGED Then m_ActiveRawMode = RAWMODE.BY_POINTS RawModeCmBx.SelectedIndex = m_ActiveRawMode RawModeView() UpdateCircles() EgtDraw() End If End Sub Private Sub DamagedBtn_Click(sender As Object, e As RoutedEventArgs) Handles DamagedBtn.Click m_ActiveRawMode = RAWMODE.DAMAGED RawModeView() RemoveCircles() EgtDraw() End Sub Private Sub AddBtn_Click(sender As Object, e As RoutedEventArgs) Handles AddBtn.Click Select Case m_ActiveRawMode Case RAWMODE.RECTANGLE AddBtn.IsChecked = False Case RAWMODE.BY_POINTS RemoveBtn.IsChecked = False m_nPtMode = If(AddBtn.IsChecked, PTMODE.ADD, PTMODE.MOVE) Case RAWMODE.FROM_LASER Dim ptAcquired As Point3d If Not AcquireLaserPoint(ptAcquired) Then m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 32)) End If ' Limito il punto a stare nella tavola con franco pari al kerf If ptAcquired.x < m_RawKerf Then ptAcquired.x = m_RawKerf + SAFE_RAW_DIST If ptAcquired.y < m_RawKerf Then ptAcquired.y = m_RawKerf + SAFE_RAW_DIST If ptAcquired.x > m_dTableLength - m_RawKerf Then ptAcquired.x = m_dTableLength - m_RawKerf - SAFE_RAW_DIST If ptAcquired.y > m_dTableWidth - m_RawKerf Then ptAcquired.y = m_dTableWidth - m_RawKerf - SAFE_RAW_DIST ' Aggiusto Z punto movimentato (è in locale al tavolo) ptAcquired.z = m_CurrentMachine.dAdditionalTable + m_RawHeight 'Porto il punto nel riferimento del grezzo Dim frRaw As New Frame3d EgtGetGroupGlobFrame(m_CurrProjPage.m_nRawId, frRaw) ptAcquired.LocToLoc(New Frame3d(m_ptTableMin), frRaw) If m_bptLast Then If Point3d.SameApprox(ptAcquired, m_ptLast) Then AddBtn.IsChecked = False Exit Sub End If Dim NewLine As Integer = EgtCreateLine(m_CurrProjPage.m_nRawId, m_ptLast, ptAcquired) EgtSetColor(NewLine, m_KerfCol) m_CurveXKerfList.Add(NewLine) Else m_bptLast = True End If m_ptLast = ptAcquired If m_CurveXKerfList.Count > 1 Then OkBtn.IsEnabled = True CloseBtn.IsEnabled = True End If AddBtn.IsChecked = False EgtDraw() Case RAWMODE.DAMAGED ' Verifico ci sia almeno una zona rovinata If EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_DAMAGED) = GDB_ID.NULL Then AddBtn.IsChecked = False End If RemoveBtn.IsChecked = False NewBtn.IsChecked = False DeleteBtn.IsChecked = False m_nPtMode = If(AddBtn.IsChecked, PTMODE.ADD, PTMODE.MOVE) m_nPtDmgMode = DMGMODE.NONE End Select End Sub Private Function AcquireLaserPoint(ByRef ptAcquired As Point3d) As Boolean Dim ptTipP1 As Point3d ' Recupero la posizione macchina Dim dL1, dL2, dL3, dR1, dR2 As Double If Not m_MainWindow.m_CNCommunication.GetAxesPositions(dL1, dL2, dL3, dR1, dR2) Then Return False End If ' Ricavo dati lama corrente Dim sSaw As String = m_CurrentMachine.sCurrSaw ' Imposto come testa corrente il laser (senza utensile ovviamente) If Not EgtSetCalcTool("", "H3", 1) Then Return False End If ' Trasformo in posizione punta utensile in basso If Not EgtGetCalcTipFromPositions(dL1, dL2, dL3, dR1, dR2, True, ptTipP1) Then Return False End If ' Ora imposto la lama corrente If Not EgtSetCalcTool(sSaw, "H1", 1) Then Return False End If ' Porto il tip nell'origine tavola ptAcquired = ptTipP1 ptAcquired.ToLoc(New Frame3d(m_ptTableMin)) Return True End Function Private Sub RemoveBtn_Click(sender As Object, e As RoutedEventArgs) Handles RemoveBtn.Click Select Case m_ActiveRawMode Case RAWMODE.RECTANGLE RemoveBtn.IsChecked = False Case RAWMODE.BY_POINTS AddBtn.IsChecked = False m_nPtMode = If(RemoveBtn.IsChecked(), PTMODE.REMOVE, PTMODE.MOVE) Case RAWMODE.FROM_LASER If m_CurveXKerfList.Count > 0 Then If m_CurveXKerfList.Count = 1 Then ' Aggiorno ptLast con primo punto EgtStartPoint(m_CurveXKerfList(m_CurveXKerfList.Count - 1), m_ptLast) ' Cancello ultima linea EgtErase(m_CurveXKerfList(m_CurveXKerfList.Count - 1)) m_CurveXKerfList.RemoveAt(m_CurveXKerfList.Count - 1) Else ' Cancello ultima linea EgtErase(m_CurveXKerfList(m_CurveXKerfList.Count - 1)) m_CurveXKerfList.RemoveAt(m_CurveXKerfList.Count - 1) ' Aggiorno ptLast EgtEndPoint(m_CurveXKerfList(m_CurveXKerfList.Count - 1), m_ptLast) End If Else m_bptLast = False End If RemoveBtn.IsChecked = False EgtDraw() Case RAWMODE.DAMAGED ' Verifico ci sia almeno una zona rovinata If EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_DAMAGED) = GDB_ID.NULL Then RemoveBtn.IsChecked = False End If AddBtn.IsChecked = False NewBtn.IsChecked = False DeleteBtn.IsChecked = False m_nPtMode = If(RemoveBtn.IsChecked(), PTMODE.REMOVE, PTMODE.MOVE) m_nPtDmgMode = DMGMODE.NONE End Select End Sub Private Sub UpdateRawPart(Optional bHeightModified As Boolean = False) ' Se cambiato spessore e c'è foto, aggiorno quota fotografia If bHeightModified And m_CurrProjPage.GetPhoto() <> GDB_ID.NULL Then ' Aggiorno spessore in progetto corrente m_CurrProjPage.m_dRawHeight = m_RawHeight m_CurrProjPage.UpdateHeightTxBx() ' Ricarico fotografia m_CurrProjPage.UpdatePhoto() End If ' Recupero il colore (con la foto lo rendo molto più trasparente) Dim Col = m_RawCol ' in presenza di foto rendo molto più trasparente If m_CurrProjPage.GetPhoto() <> GDB_ID.NULL Then Col.A = 20 ' Se non esiste già il grezzo (primo con fase 1) e richiesto, lo inserisco Dim nRawId As Integer = EgtGetFirstRawPart() While nRawId <> GDB_ID.NULL And Not EgtVerifyRawPartPhase(nRawId, 1) nRawId = EgtGetNextRawPart(nRawId) End While If nRawId = GDB_ID.NULL And m_RawHeight > EPS_SMALL Then m_CurrProjPage.m_nRawId = EgtAddRawPart(Point3d.ORIG(), m_RawLength + 2 * m_RawKerf, m_RawWidth + 2 * m_RawKerf, m_RawHeight, Col) ' se esiste e da cancellare ElseIf m_RawHeight < EPS_SMALL Then EgtRemoveRawPart(nRawId) m_CurrProjPage.m_nRawId = GDB_ID.NULL ' Altrimenti lo modifico Else m_CurrProjPage.m_nRawId = nRawId EgtModifyRawPart(nRawId, Point3d.ORIG(), m_RawLength + 2 * m_RawKerf, m_RawWidth + 2 * m_RawKerf, m_RawHeight, Col) End If ' Se non cancellato If m_RawHeight > EPS_SMALL Then AdjustRawPartKerf() ' Sistemo la posizione Dim ptRef As New Point3d(m_RawOffsX - m_RawKerf, m_RawOffsY - m_RawKerf, m_CurrentMachine.dAdditionalTable) If EgtMoveToCornerRawPart(m_CurrProjPage.m_nRawId, ptRef, MCH_CR.BL) Then OkBtn.IsEnabled = True m_CurrProjPage.ClearMessage() Else OkBtn.IsEnabled = False m_CurrProjPage.SetErrorMessage("Errore nella posizione o dimensione del grezzo") End If End If ' Aggiorno visualizzazione EgtZoom(ZM.ALL) End Sub Private Function AdjustRawPartKerf() As Boolean ' Se non c'è il grezzo, esco If m_CurrProjPage.m_nRawId = GDB_ID.NULL Then Return False End If ' Cancello eventuale vecchio contorno di kerf Dim nKerfId As Integer = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) EgtErase(nKerfId) ' box grezzo Dim ptMin, ptMax As Point3d GetRawBox(ptMin, ptMax) ptMin.x += m_RawKerf ptMin.y += m_RawKerf ptMin.z = ptMax.z ptMax.x -= m_RawKerf ptMax.y -= m_RawKerf ' Creo il nuovo contorno del kerf nKerfId = EgtCreateRectangle2P(m_CurrProjPage.m_nRawId, ptMin, ptMax, GDB_RT.GLOB) EgtSetName(nKerfId, NAME_KERF) EgtSetColor(nKerfId, m_KerfCol) ' Salvo il valore del kerf (sempre in mm) EgtSetInfo(m_CurrProjPage.m_nRawId, KEY_KERF, m_RawKerf) Return True End Function Private Sub UpdateRawPartHeight() ' Se da creare If m_CurrProjPage.m_nRawId = GDB_ID.NULL Then UpdateRawPart(True) Return ' se da cancellare ElseIf m_RawHeight < EPS_SMALL Then EgtRemoveRawPart(m_CurrProjPage.m_nRawId) m_CurrProjPage.m_nRawId = GDB_ID.NULL ' altrimenti da aggiornare Else ' Aggiorno solido EgtModifyRawPartHeight(m_CurrProjPage.m_nRawId, m_RawHeight) ' Aggiorno quota kerf Dim nKerfId As Integer = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) If nKerfId <> GDB_ID.NULL Then Dim ptStart As Point3d EgtStartPoint(nKerfId, GDB_ID.ROOT, ptStart) Dim dKerfHeight = ptStart.z - m_ptTableMin.z - m_CurrentMachine.dAdditionalTable EgtMove(nKerfId, New Vector3d(0, 0, m_RawHeight - dKerfHeight)) End If End If ' Aggiorno spessore in progetto corrente m_CurrProjPage.m_dRawHeight = m_RawHeight ' Se c'è foto, aggiorno quota fotografia If m_CurrProjPage.GetPhoto() <> GDB_ID.NULL Then ' Ricarico fotografia m_CurrProjPage.UpdatePhoto() End If End Sub Private Sub UpdateRawPartKerf() ' Se non c'è il grezzo, esco If m_CurrProjPage.m_nRawId = GDB_ID.NULL Then Return End If ' Recupero percorso di contorno kerf Dim nKerfId As Integer = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) ' Recupero colore grezzo ( in presenza di foto rendo molto più trasparente) Dim Col = m_RawCol If m_CurrProjPage.GetPhoto() <> GDB_ID.NULL Then Col.A = 20 ' Aggiorno il grezzo EgtModifyRawPart(m_CurrProjPage.m_nRawId, nKerfId, m_RawKerf, m_ptTableMin.z, m_RawHeight, Col) ' Salvo il nuovo valore (sempre in mm) EgtSetInfo(m_CurrProjPage.m_nRawId, KEY_KERF, m_RawKerf) ' Aggiorno dimensioni e posizione grezzo UpdateRawXYData() End Sub Private Sub UpdateRawXYData() ' Identificativo solido del grezzo Dim nRawSolidId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_RAW_SOLID) ' Aggiorno dimensioni grezzo nel piano XY Dim ptMin, ptMax As Point3d If EgtGetBBoxGlob(nRawSolidId, GDB_BB.STANDARD, ptMin, ptMax) Then ' aggiorno dati grezzo m_RawLength = ptMax.x - ptMin.x - 2 * m_RawKerf m_RawWidth = ptMax.y - ptMin.y - 2 * m_RawKerf m_RawOffsX = ptMin.x + m_RawKerf - m_ptTableMin.x m_RawOffsY = ptMin.y + m_RawKerf - m_ptTableMin.y ' Assegno dati grezzo rettangolare ai textbox LengthTxBx.Text = LenToString(m_RawLength, 2) WidthTxBx.Text = LenToString(m_RawWidth, 2) OffsetXTxBx.Text = LenToString(m_RawOffsX, 2) OffsetYTxBx.Text = LenToString(m_RawOffsY, 2) End If ' Aggiorno la posizione del grezzo Dim ptRef As New Point3d(m_RawOffsX - m_RawKerf, m_RawOffsY - m_RawKerf, m_CurrentMachine.dAdditionalTable) If EgtMoveToCornerRawPart(m_CurrProjPage.m_nRawId, ptRef, MCH_CR.BL) Then OkBtn.IsEnabled = True m_CurrProjPage.ClearMessage() Else OkBtn.IsEnabled = False m_CurrProjPage.SetErrorMessage("Errore nella posizione o dimensione del grezzo") End If End Sub Private Sub AdjustRawPartOnStart() ' Se non c'è la foto va già bene così If m_CurrProjPage.GetPhoto() = GDB_ID.NULL Then Return ' Disabilito impostazione modificato Dim bOldEnMod = EgtGetEnableModified() If bOldEnMod Then EgtDisableModified() ' Disabilito la texture sul grezzo Dim nSolidId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_RAW_SOLID) EgtRemoveTextureData(nSolidId) ' Sistemo il colore Dim Col = m_RawCol Col.A = 20 EgtSetColor(nSolidId, Col, True) ' Ripristino precedente impostazione modificato If bOldEnMod Then EgtEnableModified() End Sub Private Sub AdjustRawPartOnExit() ' Se non c'è il grezzo, esco If m_CurrProjPage.m_nRawId = GDB_ID.NULL Then Return ' Disabilito impostazione modificato Dim bOldEnMod = EgtGetEnableModified() If bOldEnMod Then EgtDisableModified() ' Salvo la modalità di definizione If m_ActiveRawMode = RAWMODE.RECTANGLE Then EgtRemoveInfo(m_CurrProjPage.m_nRawId, KEY_RAWBYPOINTS) Else EgtSetInfo(m_CurrProjPage.m_nRawId, KEY_RAWBYPOINTS, 1) End If ' Verifico senso antiorario della curva di kerf Dim nKerfId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) Dim dArea As Double If EgtCurveAreaXY(nKerfId, dArea) AndAlso dArea < 0 Then EgtInvertCurve(nKerfId) End If ' Elimino regioni per nesting RemoveNestRegions() ' Se c'è la foto devo sistemare If m_CurrProjPage.GetPhoto() <> GDB_ID.NULL Then ' Carico la texture della foto sul grezzo Dim nSolidId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_RAW_SOLID) EgtSetTextureName(nSolidId, PHOTO_NAME) ' Sistemo il riferimento della texture Dim refTxr As New Frame3d m_CurrProjPage.GetPhotoTextureRef(refTxr) EgtSetTextureFrame(nSolidId, refTxr, GDB_RT.GLOB) ' Sistemo il colore Dim colWhite As New Color3d(255, 255, 255, 100) EgtSetColor(nSolidId, colWhite) ' Anche per il contorno Dim nOutlineId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_RAW_OUTLINE) EgtSetColor(nOutlineId, colWhite) EgtSetStatus(nOutlineId, GDB_ST.OFF) ' Nascondo la foto m_MainWindow.m_CurrentProjectPageUC.ShowPhoto(False) End If ' Ripristino precedente impostazione modificato If bOldEnMod Then EgtEnableModified() End Sub Private Function RemoveNestRegions() As Boolean ' Cancello eventuale vecchia regione fuori kerf per nesting EgtErase(EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_OUTKERF_REG)) ' Cancello eventuale vecchia regione di riferimento per nesting EgtErase(EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_REF_REG)) ' Cancello eventuali vecchie regioni aree rovinate per nesting Dim nId As Integer = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_DAMAGED_REG) While nId <> GDB_ID.NULL EgtErase(nId) nId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_DAMAGED_REG) End While Return True End Function Private Sub LengthTxBx_EgtClosed(sender As Object, e As EventArgs) Handles LengthTxBx.EgtClosed Dim dLength As Double If Not StringToLen(LengthTxBx.Text, dLength) Or dLength < EPS_SMALL Then Return End If Dim dMaxLen = m_dTableLength - m_RawOffsX - m_RawKerf If dLength <= dMaxLen Then m_CurrProjPage.ClearMessage() m_RawLength = dLength UpdateRawPart() Else LengthTxBx.Text = LenToString(m_RawLength, 2) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 16) & " " & LenToString(dMaxLen, 2)) 'Massima lunghezza = End If End Sub Private Sub WidthTxBx_EgtClosed(sender As Object, e As EventArgs) Handles WidthTxBx.EgtClosed Dim dWidth As Double If Not StringToLen(WidthTxBx.Text, dWidth) Or dWidth < EPS_SMALL Then Return End If Dim dMaxWidth = m_dTableWidth - m_RawOffsY - m_RawKerf If dWidth <= dMaxWidth Then m_CurrProjPage.ClearMessage() m_RawWidth = dWidth UpdateRawPart() Else WidthTxBx.Text = LenToString(m_RawWidth, 2) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 17) & " " & LenToString(dMaxWidth, 2)) 'Massima larghezza = End If End Sub Private Sub HeightTxBx_EgtClosed(sender As Object, e As EventArgs) Handles HeightTxBx.EgtClosed Dim dHeight As Double If Not StringToLen(HeightTxBx.Text, dHeight) Then Return End If If dHeight > -EPS_ZERO Then m_CurrProjPage.ClearMessage() If Math.Abs(dHeight - m_RawHeight) > EPS_SMALL Then m_RawHeight = dHeight UpdateRawPartHeight() ' Ridisegno EgtDraw() End If Else HeightTxBx.Text = LenToString(m_RawHeight, 3) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 18)) 'Non sono ammessi spessori negativi End If End Sub Private Sub OffsetXTxBx_EgtClosed(sender As Object, e As EventArgs) Handles OffsetXTxBx.EgtClosed Dim dOffsetX As Double If Not StringToLen(OffsetXTxBx.Text, dOffsetX) Then Return End If Dim dMinOffsetX = m_RawKerf If dOffsetX >= dMinOffsetX Then m_RawOffsX = dOffsetX UpdateRawPart() Else OffsetXTxBx.Text = LenToString(m_RawOffsX, 2) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 19) & " " & LenToString(dMinOffsetX, 2)) 'Minimo offset X = End If End Sub Private Sub OffsetYTxBx_EgtClosed(sender As Object, e As EventArgs) Handles OffsetYTxBx.EgtClosed Dim dOffsetY As Double If Not StringToLen(OffsetYTxBx.Text, dOffsetY) Then Return End If Dim dMinOffsetY = m_RawKerf If dOffsetY >= dMinOffsetY Then m_RawOffsY = dOffsetY UpdateRawPart() Else OffsetYTxBx.Text = LenToString(m_RawOffsY, 2) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 20) & " " & LenToString(dMinOffsetY, 2)) 'Minimo offset Y = End If End Sub Private Sub KerfTxBx_EgtClosed(sender As Object, e As EventArgs) Handles KerfTxBx.EgtClosed Dim dKerf As Double If Not StringToLen(KerfTxBx.Text, dKerf) Then Return End If Dim dMinKerf = 0 Dim dMaxKerf = Math.Min(Math.Min(m_RawOffsX, m_RawOffsY), Math.Min(m_dTableLength - m_RawLength - m_RawOffsX, m_dTableWidth - m_RawWidth - m_RawOffsY)) If dKerf >= dMinKerf And dKerf <= dMaxKerf Then m_RawKerf = dKerf UpdateRawPartKerf() ' Ridisegno EgtDraw() ElseIf dKerf < dMinKerf Then KerfTxBx.Text = LenToString(m_RawKerf, 2) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 21) & " " & LenToString(dMinKerf, 2)) 'Minimo kerf = Else KerfTxBx.Text = LenToString(m_RawKerf, 2) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 22) & " " & LenToString(dMaxKerf, 2)) 'Massimo kerf = End If End Sub Private Sub RawProbingBtn_Click(sender As Object, e As RoutedEventArgs) Handles RawProbingBtn.Click ' Verifico diametro lama corrente rispetto a massimo per tastatura grezzo If Not m_CurrentMachine.IsRawProbingPossible() Then m_CurrProjPage.SetWarningMessage(EgtMsg(MSG_RAWPARTPAGEUC + 34)) ' Lama troppo grande per tastatura Return End If ' Recupero origine tavola rispetto allo 0 macchina Dim TableRef As Point3d EgtGetTableRef(1, TableRef) ' Recupero file LUA EgtLuaExecFile(m_CurrentMachine.sMachDir() & "\DirectCmd\RawProbing.lua") ' Imposto parametri EgtLuaSetGlobNumVar("CMD.MIDRAWX", m_RawOffsX + m_RawLength / 2) EgtLuaSetGlobNumVar("CMD.MIDRAWY", m_RawOffsY + m_RawWidth / 2) EgtLuaSetGlobNumVar("CMD.THICK", m_RawHeight + m_CurrentMachine.dAdditionalTable) EgtLuaSetGlobNumVar("CMD.TABLEX", TableRef.x) EgtLuaSetGlobNumVar("CMD.TABLEY", TableRef.y) EgtLuaSetGlobNumVar("CMD.TABLEZ", TableRef.z) EgtLuaSetGlobBoolVar("CMD.INCHES", m_MainWindow.m_CNCommunication.GetMachineInInches()) EgtLuaCallFunction("CMD.CmdString") ' Leggo variabili Dim CmdString As String = String.Empty EgtLuaGetGlobStringVar("CMD.CMDSTRING", CmdString) ' Reset lua EgtLuaResetGlobVar("CMD") ' Modifico stringa per inserire i newline CmdString = CmdString.Replace("
", Environment.NewLine) ' Creo file... Dim FilePath As String = m_MainWindow.GetCncDir() & "\RawProbing" & m_CurrentMachine.sIsoFileExt ' ...e ci scrivo Dim Writer As New IO.StreamWriter(FilePath, False) Writer.Write(CmdString) Writer.Close() ' Verifico se sono connesso alla macchina prima di continuare If Not m_MainWindow.m_bNCLink Then Exit Sub End If ' Mando file al CN If Not m_MainWindow.m_CNCommunication.SendProgram(FilePath, 900) Then Exit Sub End If EgtOutLog("Probing prog send") ' Aspetto e lo avvio System.Threading.Thread.Sleep(300) m_MainWindow.m_CNCommunication.m_CN.DGeneralFunctions_CycleStart() EgtOutLog("Probing prog start") ' Creo MsgBox di attesa Dim MsgBoxStateInfo As New EgtMsgBox(m_MainWindow, EgtMsg(MSG_RAWPARTPAGEUC + 25), EgtMsg(MSG_RAWPARTPAGEUC + 26), True, EgtMsgBox.Buttons.CANCEL, EgtMsgBox.Icons.NULL) Dim ProbingStateNameVar As String = String.Empty GetPrivateProfileString(S_MACH_PROBING, K_PROBINGSTATEVAR, "", ProbingStateNameVar, m_MainWindow.GetMachIniFile()) EgtOutLog("variabile stato probe: " & ProbingStateNameVar) m_MainWindow.m_CNCommunication.m_CN.n_DReadELS_handle = 0 m_MainWindow.m_CNCommunication.m_CN.ReadEls_Add_Parameter(ProbingStateNameVar, 1) EgtOutLog("Read probe state var") ' Definisco flag tastatura Dim bProbingOk As Boolean = False For I = 0 To 120 ' Se NUM Axium o Siemens devo rileggere la variabile ad ogni ciclo If m_MainWindow.m_CNCommunication.m_nNCType = 1 Or m_MainWindow.m_CNCommunication.m_nNCType = 3 Then m_MainWindow.m_CNCommunication.m_CN.ReadEls_Add_Parameter(ProbingStateNameVar, 1) End If EgtOutLog("Handle: " & m_MainWindow.m_CNCommunication.m_CN.n_DReadELS_handle) If m_MainWindow.m_CNCommunication.m_CN.n_DReadELS_handle = 1 Then Dim L108Val As Integer = CInt(m_MainWindow.m_CNCommunication.m_CN.d_DReadELS_value) EgtOutLog("variabile rawprobing stato: " & m_MainWindow.m_CNCommunication.m_CN.d_DReadELS_value) Select Case L108Val Case 0 ' Non faccio alcunchè perchè sta tastando Case 1 ' Tastatura completata bProbingOk = True Exit For Case 2 ' Errore bProbingOk = False Exit For End Select End If System.Threading.Thread.Sleep(1000) ' Incremento progressbar MsgBoxStateInfo.LoadingPrBr_Value += 100 / 120 ' Costringo ad aggiornare GUI UpdateUI() ' Verifico se interrotto dall'utente If MsgBoxStateInfo.DialogResult = 0 Then bProbingOk = False Exit For End If Next ' Se tastatura riuscita If bProbingOk Then ' Leggo spessore misurato Dim RawThicknessNameVar As String = String.Empty GetPrivateProfileString(S_MACH_PROBING, K_RAWTHICKNESS, "", RawThicknessNameVar, m_MainWindow.GetMachIniFile()) m_MainWindow.m_CNCommunication.m_CN.n_DReadELS_handle = 0 m_MainWindow.m_CNCommunication.m_CN.ReadEls_Add_Parameter(RawThicknessNameVar, 1) Dim RawThickness As Double = 0 For I = 0 To 20 ' Se NUM Axium o Siemens devo rileggere la variabile ad ogni ciclo If m_MainWindow.m_CNCommunication.m_nNCType = 1 Or m_MainWindow.m_CNCommunication.m_nNCType = 3 Then m_MainWindow.m_CNCommunication.m_CN.ReadEls_Add_Parameter(RawThicknessNameVar, 1) End If If m_MainWindow.m_CNCommunication.m_CN.n_DReadELS_handle = 1 Then RawThickness = m_MainWindow.m_CNCommunication.m_CN.d_DReadELS_value EgtOutLog("Sawprobing var 2 spessore: " & m_MainWindow.m_CNCommunication.m_CN.d_DReadELS_value) MsgBoxStateInfo.LoadingPrBr_Value = 100 MsgBoxStateInfo.Text = EgtMsg(MSG_RAWPARTPAGEUC + 27) ' Costringo ad aggiornare GUI UpdateUI() System.Threading.Thread.Sleep(1500) ' Trasformo misura rilevata in mm If m_MainWindow.m_CNCommunication.GetMachineInInches() Then RawThickness *= ONEINCH / 1000 Else RawThickness *= ONEMM / 1000 End If ' Sottraggo eventuale spessore sovratavola RawThickness -= m_CurrentMachine.dAdditionalTable ' Imposto spessore misurato come altezza grezzo If RawThickness > -EPS_ZERO Then m_CurrProjPage.ClearMessage() If Math.Abs(RawThickness - m_RawHeight) > EPS_SMALL Then HeightTxBx.Text = LenToString(RawThickness, 3) m_RawHeight = RawThickness UpdateRawPartHeight() ' Ridisegno EgtDraw() End If Else HeightTxBx.Text = LenToString(m_RawHeight, 3) m_CurrProjPage.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 18)) 'Non sono ammessi spessori negativi End If ' Chiudo msgbox MsgBoxStateInfo.Close() Exit For End If System.Threading.Thread.Sleep(100) Next ' Altrimenti tastatura non riuscita o interrotta dall'utente Else m_MainWindow.m_CurrentProjectPageUC.SetErrorMessage(EgtMsg(MSG_RAWPARTPAGEUC + 28)) MsgBoxStateInfo.Text = EgtMsg(MSG_RAWPARTPAGEUC + 28) 'Errore nella tastatura del grezzo ' Costringo ad aggiornare GUI UpdateUI() System.Threading.Thread.Sleep(1500) MsgBoxStateInfo.Close() End If ' Cancello messaggio m_MainWindow.m_CurrentProjectPageUC.ClearMessage() End Sub Private Sub RawPartPage_Unloaded(sender As Object, e As RoutedEventArgs) ' Rimuovo layer temporaneo per crocette EgtErase(m_nTempLay) ' Dichiaro pagina non attiva m_bActive = False End Sub Private Sub VerifyLaserDefining() If m_bIsRawDefiningByLaser Then If m_CurveXKerfList.Count > 1 Then CloseRawByLaser() Else ' Elimino tutti i segmenti disegnati For Each nEntityId In m_CurveXKerfList If EgtGetType(nEntityId) = GDB_TY.CRV_LINE Then EgtErase(nEntityId) End If Next ' Azzero lista e punto di partenza m_CurveXKerfList.Clear() 'Creo rettangolo UpdateRawPart() End If m_bIsRawDefiningByLaser = False End If End Sub Private Sub LoadFromMachine() ' Elimino grezzo già presente EgtErase(EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_RAW_SOLID)) EgtErase(EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF)) EgtErase(EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_RAW_OUTLINE)) Dim nId As Integer = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_DAMAGED) While nId <> GDB_ID.NULL EgtErase(nId) nId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_DAMAGED) End While EgtDraw() End Sub Private Sub CloseBtn_Click(sender As Object, e As RoutedEventArgs) Handles CloseBtn.Click CloseRawByLaser() End Sub Private Sub CloseRawByLaser() ' Verifico ci siano punti If m_CurveXKerfList.Count() = 0 Then Return ' Recupero punto iniziale prima linea del grezzo Dim ptStart As Point3d EgtStartPoint(m_CurveXKerfList(0), ptStart) m_CurveXKerfList.Add(EgtCreateLine(m_CurrProjPage.m_nRawId, m_ptLast, ptStart)) ' Trasformo lista di curve in un array Dim CurveXKerfArray As Integer() = m_CurveXKerfList.ToArray ' Creo contorno kerf Dim nKerfId As Integer = EgtCreateCurveCompoByChain(m_CurrProjPage.m_nRawId, m_CurveXKerfList.Count, CurveXKerfArray, ptStart, True) EgtSetName(nKerfId, NAME_KERF) EgtSetColor(nKerfId, m_KerfCol) ' Pulisco lista entità del grezzo m_CurveXKerfList.Clear() ' Aggiorno il grezzo UpdateRawPartKerf() ' Aggiorno dimensioni e posizione grezzo UpdateRawXYData() ' Salvo il valore del kerf (sempre in mm) EgtSetInfo(m_CurrProjPage.m_nRawId, KEY_KERF, m_RawKerf) ' Segno flag che indica fine della definizione m_bIsRawDefiningByLaser = False ' Elimino primo punto per prossimo grezzo m_bptLast = False ' Aggiorno visualizzazione EgtDraw() ' Disattivo il bottone chiudi grezzo CloseBtn.IsEnabled = False End Sub #Region "Damaged Area" Private Sub AddNewDamagedArea() ' Creo triangolo che abbia il punto selezionato come centro (lato 100mm) ' calcolo punto in basso a sinistra Dim ptBottomLeft As Point3d = New Point3d(m_ptPrev.x - 50, m_ptPrev.y - (100 / 6 * Math.Sqrt(3)), m_ptTableMin.z + m_CurrentMachine.dAdditionalTable + m_RawHeight) Dim vtRight As Vector3d = New Vector3d(100, 0, 0) ' creo lato base Dim nBaseId As Integer = EgtCreateLine(m_CurrProjPage.m_nRawId, ptBottomLeft, ptBottomLeft + vtRight, GDB_RT.GLOB) ' calcolo vertice superiore del triangolo Dim vtTop As New Vector3d(vtRight) vtTop.Rotate(Vector3d.Z_AX, 60) ' creo lati inclinati Dim nCat1 As Integer = EgtCreateLine(m_CurrProjPage.m_nRawId, ptBottomLeft + vtRight, ptBottomLeft + vtTop, GDB_RT.GLOB) Dim nCAt2 As Integer = EgtCreateLine(m_CurrProjPage.m_nRawId, ptBottomLeft + vtTop, ptBottomLeft, GDB_RT.GLOB) ' Creo contorno zona rovinata Dim nDmgId As Integer = EgtCreateCurveCompoByChain(m_CurrProjPage.m_nRawId, 3, {nBaseId, nCat1, nCAt2}, ptBottomLeft, True) ' Assegno il nome alla CCompo creata EgtSetName(nDmgId, NAME_DAMAGED) ' e il colore EgtSetColor(nDmgId, m_KerfCol) ' Imposto come area danneggiata corrente m_nSelDmg = nDmgId ' Disabilito modalità aggiungi zona rovinata m_nPtDmgMode = DMGMODE.NONE ' Tolgo il check al bottone nuovo NewBtn.IsChecked = False End Sub Private Sub RemoveDamagedArea() ' Elimino area rovinata selezionata EgtErase(m_nSelDmg) ' Dichiaro zona danneggiata non selezionata m_nSelDmg = GDB_ID.NULL ' Disabilito modalità rimuovi zona rovinata m_nPtDmgMode = DMGMODE.NONE ' Tolgo il check al bottone elimina DeleteBtn.IsChecked = False End Sub Private Sub NewBtn_Click(sender As Object, e As RoutedEventArgs) Handles NewBtn.Click ' Procedo solo se modalità aree danneggiate If Not DamagedBtn.IsChecked Then Return DeleteBtn.IsChecked = False m_nPtDmgMode = If(NewBtn.IsChecked(), DMGMODE.ADD, DMGMODE.NONE) AddBtn.IsChecked = False RemoveBtn.IsChecked = False End Sub Private Sub DeleteBtn_Click(sender As Object, e As RoutedEventArgs) Handles DeleteBtn.Click ' Procedo solo se modalità aree danneggiate If Not DamagedBtn.IsChecked Then Return ' Verifico ci sia almeno una zona rovinata If EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_DAMAGED) = GDB_ID.NULL Then DeleteBtn.IsChecked = False End If NewBtn.IsChecked = False m_nPtDmgMode = If(DeleteBtn.IsChecked(), DMGMODE.REMOVE, DMGMODE.NONE) AddBtn.IsChecked = False RemoveBtn.IsChecked = False End Sub #End Region #Region "Circles" Private Sub UpdateCircles() ' Elimino vecchi punti finali EgtEmptyGroup(m_nTempLay) ' Identificativo curva Dim nId As Integer = GDB_ID.NULL If m_ActiveRawMode = RAWMODE.BY_POINTS Then nId = EgtGetFirstNameInGroup(m_CurrProjPage.m_nRawId, NAME_KERF) ElseIf m_ActiveRawMode = RAWMODE.DAMAGED Then nId = m_nSelDmg End If ' Verifico validità curva If nId = GDB_ID.NULL Then Return ' riferimento globale della stessa Dim frRef As New Frame3d EgtGetGlobFrame(nId, frRef) ' Recupero i punti finali delle diverse entità componenti Dim dU As Double = 1 Dim ptP As Point3d While EgtAtParamPoint(nId, dU, ptP) ptP.ToGlob(frRef) CreateCircle(m_nTempLay, ptP) dU += 1 End While End Sub Private Sub RemoveCircles() EgtEmptyGroup(m_nTempLay) End Sub Private Function CreateCircle(nLayerId As Integer, ptP As Point3d) As Boolean ' Aggiungo cerchio Dim nCircId As Integer = EgtCreateCircle(nLayerId, ptP, RAD_CIRCLE) EgtSetColor(nCircId, New Color3d(255, 0, 0)) Return True End Function #End Region End Class