Imports System.Collections.ObjectModel Imports System.IO Imports OmagCUT.TreeViewItem Imports EgtUILib Imports EgtWPFLib Public Class CSVPage ' Riferimenti a pagine Private m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow) Private WithEvents m_CurrProjPage As CurrentProjectPageUC ' Flag di pagina attiva Private m_bActive As Boolean = False ' Flag tipologia Private m_bFull As Boolean = False ' Flag prima apertura Private m_bFirst As Boolean = True ' Dati lista Private m_sCsvPath As String = String.Empty Private m_sFilePath As String = String.Empty Private m_CsvPartList As New List(Of CsvPart) Private m_ItemsList As New ObservableCollection(Of PartCathegoryItem) Private m_sCompoDir As String = String.Empty ' Dati del grezzo Private m_nRawId As Integer = GDB_ID.NULL Private m_ptRawMin As Point3d Private m_ptRawMax As Point3d Private Sub CSVPage_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized ' Assegno la lista dei pezzi Csv come sorgente del treeview PartsTreeView.ItemsSource = m_ItemsList ' Messaggi InsertBtn.Content = EgtMsg(MSG_CSVPAGEUC + 2) ' Inserisci RemoveBtn.Content = EgtMsg(MSG_CSVPAGEUC + 4) ' Rimuovi ' Determino se versione semplificata m_bFull = m_MainWindow.GetKeyOption(MainWindow.KEY_OPT.AUTO_NESTING) And (GetPrivateProfileInt(S_CSV, K_FULL, 1, m_MainWindow.GetIniFile()) <> 0) PlusBtn.Visibility = If(m_bFull, Windows.Visibility.Visible, Windows.Visibility.Hidden) MinusBtn.Visibility = If(m_bFull, Windows.Visibility.Visible, Windows.Visibility.Hidden) RemoveBtn.Visibility = If(m_bFull, Windows.Visibility.Visible, Windows.Visibility.Hidden) ' Determino se gestione pezzi rovinati attiva If Not m_MainWindow.m_CurrentMachine.bProdLine Or Not m_MainWindow.m_CurrentMachine.nSaveProduced = 0 Then RuinedPartsBtn.IsEnabled = False End If ' Leggo lista pezzi corrente Dim sCsvFile As String = String.Empty GetPrivateProfileString(S_CSV, K_CSVLASTFILE, "", sCsvFile, m_MainWindow.GetIniFile()) If Not String.IsNullOrEmpty(sCsvFile) Then LoadCsvPartList(sCsvFile) End If End Sub Private Sub CSVPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded ' Impostazioni m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC m_bActive = True ' Se prima esecuzione If m_bFirst Then ' Leggo direttorio componenti GetPrivateProfileString(S_COMPO, K_COMPODIR, "", m_sCompoDir, m_MainWindow.GetIniFile()) ' Visualizzazione lista ShowTreeView() m_bFirst = False End If ' Recupero dimensioni del grezzo e kerf m_nRawId = EgtGetFirstRawPart() GetRawBox(m_ptRawMin, m_ptRawMax) ' Reset bottoni Plus e Minus PlusBtn.IsChecked = False MinusBtn.IsChecked = False End Sub Private Sub CSVPage_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded m_bActive = False m_CurrProjPage.m_SceneButtons.MeasureBtn.IsChecked = False 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 End If ' 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 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) = m_nRawId) If EgtIsPart(nPartId) Or bPartInTable Then Dim nStat As Integer = GDB_ST.ON_ EgtGetStatus(nPartId, nStat) ' Se già selezionato, lo deselezione If nStat = GDB_ST.SEL Then EgtDeselectObj(nPartId) ' Altrimenti lo seleziono Else EgtSelectObj(nPartId) End If Exit While End If nId = EgtGetNextObjInSelWin() End While EgtDraw() End Sub Private Sub OkBtn_Click(sender As Object, e As RoutedEventArgs) Handles OkBtn.Click m_MainWindow.m_CadCutPageUC.CadCutPageGrid.Children.Remove(Me) m_MainWindow.m_CadCutPageUC.CadCutPageGrid.Children.Add(m_MainWindow.m_CadCutPageUC.m_NestPage) m_MainWindow.m_ActivePage = MainWindow.Pages.CadCut End Sub Private Sub NewBtn_Click(sender As Object, e As RoutedEventArgs) Handles NewBtn.Click ' Salvo lista dei pezzi attuale SaveCsvPartList() ' Pulisco path e lista dei pezzi Csv m_sCsvPath = String.Empty m_CsvPartList.Clear() ' Visualizzazione lista ShowTreeView() ' Registro in ini nessuna path WritePrivateProfileString(S_CSV, K_CSVLASTFILE, "", m_MainWindow.GetIniFile()) End Sub Private Sub OpenBtn_Click(sender As Object, e As RoutedEventArgs) Handles OpenBtn.Click ' Salvo lista dei pezzi attuale SaveCsvPartList() ' Leggo direttorio corrente dei file CSV Dim sCurrDir As String = "" GetPrivateProfileString(S_CSV, K_CSVCURRDIR, "C:\", sCurrDir, m_MainWindow.GetIniFile()) ' Apro dialogo scelta file Dim OpenFileWnd As New OpenFileWD(m_MainWindow, sCurrDir, ".CSV", ".EPL") If Not OpenFileWnd.ShowDialog() Then Return ' Salvo direttorio corrente WritePrivateProfileString(S_CSV, K_CSVCURRDIR, OpenFileWnd.GetFileDir(), m_MainWindow.GetIniFile()) ' Apertura file Dim sPath = OpenFileWnd.GetFilePath() If String.Compare(Path.GetExtension(sPath), ".CSV", True) = 0 Then LoadCsvFile(sPath) Else LoadCsvPartList(sPath) End If ' Salvo path di carico del file CSV m_CurrProjPage.SetLoadPath(sPath) ' Visualizzazione lista ShowTreeView() End Sub Private Sub RuinedPartsBtn_Click(sender As Object, e As RoutedEventArgs) Handles RuinedPartsBtn.Click ' Salvo lista dei pezzi attuale SaveCsvPartList() ' Apertura file Dim sPath = m_MainWindow.GetRuinedPartsDir() & "\" & CURR_RUINED_EPL LoadCsvPartList(sPath) ' Salvo path di carico del file CSV m_CurrProjPage.SetLoadPath(sPath) ' Visualizzazione lista ShowTreeView() End Sub Private Function LoadCsvFile(sCsvPath As String) As Boolean ' Pulisco path e lista dei pezzi Csv m_sFilePath = String.Empty m_sCsvPath = String.Empty m_CsvPartList.Clear() ' Eseguo la lettura del file Csv If Not ReadCsvFile(sCsvPath, m_bFull, m_sCsvPath, m_CsvPartList) Then m_CurrProjPage.SetErrorMessage(EgtMsg(91206)) 'Errore nella lettura del file CSV Return False End If m_sFilePath = m_sCsvPath ' Elimino pezzi nulli RemoveWrongParts(m_CsvPartList) ' Aggiorno If m_bFull Then ' Salvo come epl SaveCsvPartList() ' Rinomino file originale Dim sBakPath As String = sCsvPath & ".bak" Dim sBakName As String = Path.GetFileName(sBakPath) ' cancello eventuale vecchio backup If My.Computer.FileSystem.FileExists(sBakPath) Then My.Computer.FileSystem.DeleteFile(sBakPath) End If ' eseguo rinomina My.Computer.FileSystem.RenameFile(sCsvPath, sBakName) End If Return True End Function Private Sub ShowTreeView() ' Path del file Csv Dim TempPath As New Text.StringBuilder(260) PathCompactPathEx(TempPath, m_sCsvPath, 28, 0) CsvPathTxBl.Content = TempPath.ToString() ' Pezzi del file Csv m_ItemsList.Clear() Dim sCurrMat As String = String.Empty Dim dCurrTh As Double = 0 Dim nCatToNest As Integer = 0 Dim nCatCount As Integer = 0 Dim PartCathegory As New PartCathegoryItem("", 0) For i As Integer = 1 To m_CsvPartList.Count() ' Dati pezzo corrente Dim CurrPart As CsvPart = m_CsvPartList(i - 1) ' Gestione categoria If i = 1 Then sCurrMat = CurrPart.m_sMaterial dCurrTh = CurrPart.m_dTh ElseIf String.Compare(sCurrMat, CurrPart.m_sMaterial, True) <> 0 Or Math.Abs(dCurrTh - CurrPart.m_dTh) > 10 * EPS_SMALL Then If m_bFull Then PartCathegory.Name = If(String.IsNullOrWhiteSpace(sCurrMat), "***", sCurrMat) & " - " & LenToString(dCurrTh, 2) & " - " & nCatToNest.ToString() & "/" & nCatCount.ToString() Else PartCathegory.Name = nCatToNest.ToString() & "/" & nCatCount.ToString() End If PartCathegory.IsExpanded = True m_ItemsList.Add(PartCathegory) sCurrMat = CurrPart.m_sMaterial dCurrTh = CurrPart.m_dTh PartCathegory = New PartCathegoryItem("", 0) nCatToNest = 0 nCatCount = 0 End If ' Gestione pezzo nCatToNest += CurrPart.m_nToNest nCatCount += CurrPart.m_nCount Dim sCount As String = CurrPart.m_nToNest.ToString() & "/" & CurrPart.m_nCount.ToString() If CurrPart.m_nAdd > 0 Then sCount &= "+" & CurrPart.m_nAdd.ToString() Dim sDim As String = LenToString(CurrPart.m_dDimX, 1) & "x" & LenToString(CurrPart.m_dDimY, 1) PartCathegory.Items.Add(New PartCustomItem(CurrPart.m_sName, i, sCount, sDim, CurrPart.m_bActive)) Next ' Inserisco ultima categoria If m_bFull Then PartCathegory.Name = If(String.IsNullOrWhiteSpace(sCurrMat), "***", sCurrMat) & " - " & LenToString(dCurrTh, 2) & " - " & nCatToNest.ToString() & "/" & nCatCount.ToString() Else PartCathegory.Name = nCatToNest.ToString() & "/" & nCatCount.ToString() End If PartCathegory.IsExpanded = True m_ItemsList.Add(PartCathegory) End Sub Private Sub UpdateTreeView() For Each CatItem As PartCathegoryItem In m_ItemsList Dim sCurrMat As String = String.Empty Dim dCurrTh As Double = 0 Dim nCatToNest As Integer = 0 Dim nCatCount As Integer = 0 For Each PrtItem As PartCustomItem In CatItem.Items Dim PartData As CsvPart = m_CsvPartList(PrtItem.nType - 1) Dim sCount As String = PartData.m_nToNest.ToString() & "/" & PartData.m_nCount.ToString() If PartData.m_nAdd > 0 Then sCount &= "+" & PartData.m_nAdd.ToString() PrtItem.sText1 = sCount sCurrMat = PartData.m_sMaterial dCurrTh = PartData.m_dTh nCatToNest += PartData.m_nToNest nCatCount += PartData.m_nCount Next If m_bFull Then CatItem.Name = If(String.IsNullOrWhiteSpace(sCurrMat), "***", sCurrMat) & " - " & LenToString(dCurrTh, 2) & " - " & nCatToNest.ToString() & "/" & nCatCount.ToString() Else CatItem.Name = nCatToNest.ToString() & "/" & nCatCount.ToString() End If Next End Sub Private Sub PartsTreeView_PreviewMouseUp(sender As Object, e As MouseButtonEventArgs) Handles PartsTreeView.PreviewMouseUp ' Pezzi disattivabili solo se Csv completo If Not m_bFull Then Return If TypeOf PartsTreeView.SelectedItem Is PartCathegoryItem Then Dim SelectedCathegory As PartCathegoryItem = DirectCast(PartsTreeView.SelectedItem, PartCathegoryItem) ' Determino quanti attivi per decidere cosa fare Dim nItemOn As Integer = 0 For Each Item As PartCustomItem In SelectedCathegory.Items If Item.bIsActive Then nItemOn += 1 Next Dim bActivate As Boolean = (nItemOn <= SelectedCathegory.Items.Count() - nItemOn) ' Aggiorno stato For Each Item As PartCustomItem In SelectedCathegory.Items Item.bIsActive = bActivate m_CsvPartList(Item.nType - 1).m_bActive = Item.bIsActive Next SelectedCathegory.IsSelected = False ElseIf TypeOf PartsTreeView.SelectedItem Is PartCustomItem Then Dim SelectedCustom As PartCustomItem = DirectCast(PartsTreeView.SelectedItem, PartCustomItem) Dim PartData As CsvPart = m_CsvPartList(SelectedCustom.nType - 1) Dim nPlusMinus As Integer = GetPlusMinus() If nPlusMinus <> 0 Then ' Posso sempre aggiungere pezzi in più If nPlusMinus > 0 Then PartData.m_nToNest += 1 PartData.m_nAdd += 1 Dim sCount As String = PartData.m_nToNest.ToString() & "/" & PartData.m_nCount.ToString() If PartData.m_nAdd > 0 Then sCount &= "+" & PartData.m_nAdd.ToString() SelectedCustom.sText1 = sCount ' Posso togliere solo pezzi aggiunti non ancora inseriti ElseIf PartData.m_nAdd > 0 And PartData.m_nToNest > 0 Then PartData.m_nToNest -= 1 PartData.m_nAdd -= 1 Dim sCount As String = PartData.m_nToNest.ToString() & "/" & PartData.m_nCount.ToString() If PartData.m_nAdd > 0 Then sCount &= "+" & PartData.m_nAdd.ToString() SelectedCustom.sText1 = sCount End If Else SelectedCustom.bIsActive = Not SelectedCustom.bIsActive PartData.m_bActive = SelectedCustom.bIsActive End If SelectedCustom.IsSelected = False End If End Sub Private Sub PlusBtn_Click(sender As Object, e As RoutedEventArgs) Handles PlusBtn.Click If MinusBtn.IsChecked Then MinusBtn.IsChecked = False End Sub Private Sub MinusBtn_Click(sender As Object, e As RoutedEventArgs) Handles MinusBtn.Click If PlusBtn.IsChecked Then PlusBtn.IsChecked = False End Sub Private Function GetPlusMinus() As Integer If PlusBtn.IsChecked Then Return 1 ElseIf MinusBtn.IsChecked Then Return -1 Else Return 0 End If End Function Private Sub InsertBtn_Click(sender As Object, e As RoutedEventArgs) Handles InsertBtn.Click ' Recupero lo spessore della lastra corrente Dim dRawHeight As Double = GetRawHeight() If dRawHeight < EPS_SMALL Then Return ' Recupero il materiale della lastra corrente Dim sCurrMat As String = String.Empty If Not IsNothing(m_MainWindow.m_CurrentMachine.CurrMat) Then sCurrMat = m_MainWindow.m_CurrentMachine.CurrMat.sName End If ' Creo la lista dei pezzi inseribili nella lastra corrente Dim InsPartList As New List(Of CsvPart) For i As Integer = 1 To m_CsvPartList.Count() Dim CurrPart As CsvPart = m_CsvPartList(i - 1) If CurrPart.m_bActive And (Math.Abs(CurrPart.m_dTh - dRawHeight) < 100 * EPS_SMALL Or CurrPart.m_dTh < EPS_SMALL) And (String.IsNullOrWhiteSpace(CurrPart.m_sMaterial) Or String.IsNullOrWhiteSpace(sCurrMat) Or CurrPart.m_sMaterial = "***" Or sCurrMat = "***" Or String.Compare(CurrPart.m_sMaterial, sCurrMat, True) = 0) Then InsPartList.Add(CurrPart) End If Next ' Lancio l'inserimento dei pezzi ExecInsert(InsPartList) ' Aggiorno visualizzazione EgtZoom(ZM.ALL) ' Aggiorno TreeView UpdateTreeView() End Sub Private Function ExecInsert(InsPartList As List(Of CsvPart)) As Boolean Dim bMaxDimOnX As Boolean = (GetPrivateProfileInt(S_CSV, K_MAXDIMONX, 1, m_MainWindow.GetIniFile()) <> 0) If bMaxDimOnX Then ' Ordino la lista dei pezzi secondo la dimensione minima decrescente (va su Y) InsPartList.Sort(Function(P, Q) Dim dPMin As Double = Math.Min(P.m_dDimX, P.m_dDimY) Dim dQMin As Double = Math.Min(Q.m_dDimX, Q.m_dDimY) If Math.Abs(dPMin - dQMin) < EPS_SMALL Then Return (P.m_nOriInd - Q.m_nOriInd) Else Return CInt(Math.Ceiling(dQMin - dPMin)) End If End Function) Else ' Ordino la lista dei pezzi secondo le Y decrescenti InsPartList.Sort(Function(P, Q) If Math.Abs(P.m_dDimY - Q.m_dDimY) < EPS_SMALL Then Return (P.m_nOriInd - Q.m_nOriInd) Else Return CInt(Math.Ceiling(Q.m_dDimY - P.m_dDimY)) End If End Function) End If ' Creo o svuoto gruppo temporaneo per i pezzi Dim nIpGrp As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, "CSV") If nIpGrp = GDB_ID.NULL Then nIpGrp = EgtCreateGroup(GDB_ID.ROOT) If nIpGrp = GDB_ID.NULL Then Return False EgtSetName(nIpGrp, "CSV") Else EgtEmptyGroup(nIpGrp) End If EgtSetLevel(nIpGrp, GDB_LV.TEMP) EgtSetStatus(nIpGrp, GDB_ST.OFF) ' Carico lua per creare rettangoli Dim sLuaPath = m_sCompoDir & "\Rettangolo.lua" If Not EgtLuaExecFile(sLuaPath) Then Return False ' Inserisco nel gruppo un nuovo componente per ogni pezzo da inserire For i As Integer = 1 To InsPartList.Count() Dim CurrPart As CsvPart = InsPartList(i - 1) ' Se non è un rettangolo, vado oltre If Not CurrPart.m_bIsRect Then Continue For ' Definizione variabili Dim dDimX = CurrPart.m_dDimX Dim dDimY = CurrPart.m_dDimY If bMaxDimOnX And dDimY > dDimX Then Dim dTemp As Double = dDimX dDimX = dDimY dDimY = dTemp End If EgtLuaSetGlobNumVar("CMP.V1", dDimX) EgtLuaSetGlobNumVar("CMP.V2", dDimY) EgtLuaSetGlobStringVar("CMP.INFO", CurrPart.m_sName) ' Esecuzione componente If Not EgtLuaExecLine("CMP_Draw(false)") Then Continue For ' Recupero Id del nuovo componente Dim nId As Integer = EgtGetLastPart() If nId = GDB_ID.NULL Then Continue For CurrPart.m_nId = nId ' Muovo la regione in Z per evitare problemi in visualizzazione Dim nRegId = EgtGetFirstNameInGroup(nId, NAME_REGION) EgtMove(nRegId, New Vector3d(0, 0, DELTAZ_REG), GDB_RT.GLOB) ' Eventuale testo per indicare il sopra If Not bMaxDimOnX Then Dim dH As Double = Math.Min(0.1 * dDimY, 30) Dim nText As Integer = EgtCreateTextAdv(nRegId, New Point3d(dDimX / 2, dDimY - 0.6 * dH, 0), 0, "*TOP*", "", 500, False, dH, 1, 0, INS_POS.MC) EgtSetColor(nText, New Color3d()) End If ' Aggiusto per lavorazioni EgtAdjustFlatPart(nId) ' Se Csv completo, aggiungo info su CSV di origine If m_bFull Then EgtSetInfo(nId, INFO_CSV_PATH, m_sCsvPath) EgtSetInfo(nId, INFO_CSV_PART, CurrPart.m_sName) End If ' Imposto colore testi Utility.SetTextColor( nRegId) ' Lo sposto nel gruppo speciale EgtRelocate(nId, nIpGrp) Next EgtLuaResetGlobVar("CMP") EgtLuaResetGlobVar("CMP_Draw") ' Provo ad inserire i pezzi For i As Integer = 1 To InsPartList.Count() Dim CurrPart As CsvPart = InsPartList(i - 1) While CurrPart.m_nToNest > 0 If m_bFull Then If NestOnePart(CurrPart.m_nId) Then CurrPart.m_nToNest -= 1 Else Exit While End If Else If ParkOnePart(CurrPart.m_nId) Then CurrPart.m_nToNest -= 1 Else Exit While End If End If End While Next Return True End Function Private Function NestOnePart(nId As Integer) As Boolean ' Inserisco una copia del pezzo nel grezzo Dim nId2 As Integer = EgtCopyGlob(nId, GDB_ID.ROOT) If Not m_MainWindow.m_CadCutPageUC.m_NestPage.InsertOnePart(nId2) Then EgtErase(nId2) Return False Else Return True End If End Function Private Function ParkOnePart(nId As Integer) As Boolean ' Inserisco in parcheggio una copia del pezzo Dim nId2 As Integer = EgtCopyGlob(nId, GDB_ID.ROOT) If Not m_MainWindow.m_CadCutPageUC.m_NestPage.StoreOnePart(nId2, True) Then EgtErase(nId2) Return False Else Return True End If End Function Private Sub RemoveBtn_Click(sender As Object, e As RoutedEventArgs) Handles RemoveBtn.Click ' Elenco eventuali altre liste Csv riferite dai pezzi Dim bOther As Boolean = False Dim sOtherCsv As String = String.Empty ' Rimuovo i pezzi selezionati della lista CSV corrente e ne aggiorno i contatori Dim nId As Integer = EgtGetFirstSelectedObj() While nId <> GDB_ID.NULL Dim nNextId As Integer = EgtGetNextSelectedObj() If Not RemoveOnePart(nId) Then bOther = True Dim sCsvPath As String = String.Empty If EgtGetInfo(nId, INFO_CSV_PATH, sCsvPath) Then Dim sCsvName As String = Path.GetFileNameWithoutExtension(sCsvPath) If sOtherCsv.IndexOf(sCsvName) = -1 Then sOtherCsv = sOtherCsv & sCsvName & ", " End If End If End If nId = nNextId End While ' Aggiorno visualizzazione EgtDraw() ' Aggiorno TreeView UpdateTreeView() ' Eventuale messaggi di pezzi liberi o da altre liste If bOther Then ' Pezzi non rimossi perché liberi Dim sOut As String = EgtMsg(MSG_EGTMSGBOX + 13) If Not String.IsNullOrWhiteSpace(sOtherCsv) Then ' o di altre liste Csv sOut &= EgtMsg(MSG_EGTMSGBOX + 14) & " (" & sOtherCsv.TrimEnd(", ".ToCharArray()) & ")" End If Dim WarnMsg As New EgtMsgBox(m_MainWindow, "", sOut, EgtMsgBox.Buttons.OK, EgtMsgBox.Icons.NULL, 0, 1) End If End Sub Private Function RemoveOnePart(nId As Integer) As Boolean ' Recupero identificativi da Info Dim sCsvPath As String = String.Empty EgtGetInfo(nId, INFO_CSV_PATH, sCsvPath) Dim sName As String = String.Empty EgtGetInfo(nId, INFO_CSV_PART, sName) ' Verifico che il pezzo appartenga a questo Csv If String.Compare(sCsvPath, m_sCsvPath, True) = 0 Then ' Cerco il pezzo nella lista dei pezzi For i = 1 To m_CsvPartList.Count() Dim CurrPart As CsvPart = m_CsvPartList(i - 1) If String.Compare(sName, CurrPart.m_sName, True) = 0 Then ' Se nel grezzo If EgtGetParent(nId) = m_nRawId Then ' Rimuovo le lavorazioni EraseMachinings(nId) ' Rimuovo dal grezzo EgtRemovePartFromRawPart(nId) End If ' Cancello il pezzo EgtErase(nId) ' Aggiorno il contatore CurrPart.m_nToNest += 1 ' Esco Return True End If Next End If ' Pezzo non appartenente al Csv corrente Return False End Function Friend Sub SaveCsvPartList() ' Se Csv semplificato non va salvata If Not m_bFull Then Return ' Se non c'è nulla di attivo, non faccio alcunché If String.IsNullOrEmpty(m_sCsvPath) Then EgtOutLog("CSV List missing") Return End If ' Path del file Dim sFile As String = Path.ChangeExtension(m_sFilePath, ".epl") ' Scrittura del file If WriteCsvPartList(sFile, m_sCsvPath, m_CsvPartList) Then ' Registro in ini path WritePrivateProfileString(S_CSV, K_CSVLASTFILE, sFile, m_MainWindow.GetIniFile()) End If End Sub Private Sub LoadCsvPartList(sFile As String) ' Se Csv semplificato non va letta If Not m_bFull Then Return ' Pulisco path e lista dei pezzi Csv m_sCsvPath = String.Empty m_CsvPartList.Clear() ' Lettura del file ReadCsvPartList(sFile, m_sCsvPath, m_CsvPartList) m_sFilePath = sFile ' Elimino pezzi nulli RemoveWrongParts(m_CsvPartList) End Sub Friend Sub UpdateCsvPartList() ' Se Csv semplificato non va aggiornata If Not m_bFull Then Return ' Leggo lista pezzi corrente Dim sCsvFile As String = String.Empty GetPrivateProfileString(S_CSV, K_CSVLASTFILE, "", sCsvFile, m_MainWindow.GetIniFile()) If Not String.IsNullOrEmpty(sCsvFile) Then LoadCsvPartList(sCsvFile) End If ' Visualizzazione lista ShowTreeView() End Sub End Class