diff --git a/CSVPage.xaml b/CSVPage.xaml new file mode 100644 index 0000000..36dbf81 --- /dev/null +++ b/CSVPage.xaml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CSVPage.xaml.vb b/CSVPage.xaml.vb new file mode 100644 index 0000000..3e8d6e6 --- /dev/null +++ b/CSVPage.xaml.vb @@ -0,0 +1,435 @@ +Imports System.Collections.ObjectModel +Imports OmagCUT.TreeViewItem +Imports EgtUILib + +Public Class CSVPage + + ' Riferimenti a pagine + Private m_MainWindow As MainWindow = Application.Current.MainWindow + + Private m_bFirst As Boolean = True + Private m_sCsvPath 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 + 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 + NewBtn.Content = EgtMsg(MSG_CSVPAGEUC + 3) ' Nuovo + OpenBtn.Content = EgtMsg(MSG_CSVPAGEUC + 1) ' Apri + InsertBtn.Content = EgtMsg(MSG_CSVPAGEUC + 2) ' Carica + ' Leggo lista pezzi corrente + LoadCsvPartList() + End Sub + + Private Sub CSVPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + 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 + End Sub + + Private Sub CSVPage_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded + + 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 + ' Pulisco path e lista dei pezzi Csv + m_sCsvPath = String.Empty + m_CsvPartList.Clear() + ' Visualizzazione lista + ShowTreeView() + End Sub + + 'Private Sub NewBtn_Click(sender As Object, e As RoutedEventArgs) Handles NewBtn.Click + ' m_CsvPartList(1 - 1).m_nToNest -= 1 + ' For Each Item As PartCathegoryItem In m_ItemsList + ' For Each Item2 As PartCustomItem In Item.Items + ' If Item2.nType = 1 Then + ' Item2.sText1 = m_CsvPartList(1 - 1).m_nToNest.ToString() & "/" & m_CsvPartList(1 - 1).m_nCount.ToString() + ' End If + ' Next + ' Next + + 'End Sub + + Private Sub OpenBtn_Click(sender As Object, e As RoutedEventArgs) Handles OpenBtn.Click + ' 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") + If Not OpenFileWnd.ShowDialog() Then Return + ' Salvo direttorio corrente + WritePrivateProfileString(S_CSV, K_CSVCURRDIR, OpenFileWnd.GetFileDir(), m_MainWindow.GetIniFile()) + ' Apertura file + Dim sCsvPath = OpenFileWnd.GetFilePath() + LoadCsv(sCsvPath) + ' Visualizzazione lista + ShowTreeView() + End Sub + + Private Function LoadCsv(sCsvPath As String) + ' Pulisco path e lista dei pezzi Csv + m_sCsvPath = String.Empty + m_CsvPartList.Clear() + ' Definizione variabili + EgtLuaCreateGlobTable("CSV") + EgtLuaSetGlobStringVar("CSV.FILE", sCsvPath) + ' Esecuzione + Dim nErr As Integer = 999 + If EgtLuaExecFile(m_MainWindow.GetCsvAutoDir() & "\CsvRead.lua") AndAlso + EgtLuaCallFunction("CSV.Read") Then + ' Verifica stato di errore + EgtLuaGetGlobIntVar("CSV.ERR", nErr) + End If + If nErr <> 0 Then + EgtOutLog("Error in CsvRead : " & nErr.ToString()) + Return False + End If + ' Assegno path + m_sCsvPath = sCsvPath + ' Preparo lista dei pezzi + Dim nNbr As Integer = 0 + EgtLuaGetGlobIntVar("CSV.NBR", nNbr) + For i As Integer = 1 To nNbr + Dim OnePart As New CsvPart + Dim sN As String = i.ToString() + EgtLuaGetGlobStringVar("CSV.NAME" & sN, OnePart.m_sName) + OnePart.m_bActive = True + EgtLuaGetGlobStringVar("CSV.MAT" & sN, OnePart.m_sMaterial) + EgtLuaGetGlobIntVar("CSV.COUNT" & sN, OnePart.m_nCount) + OnePart.m_nToNest = OnePart.m_nCount + EgtLuaGetGlobBoolVar("CSV.RECT" & sN, OnePart.m_bIsRect) + EgtLuaGetGlobNumVar("CSV.DIMX" & sN, OnePart.m_dDimX) + EgtLuaGetGlobNumVar("CSV.DIMY" & sN, OnePart.m_dDimY) + EgtLuaGetGlobNumVar("CSV.TH" & sN, OnePart.m_dTh) + OnePart.m_nOriInd = i + ' inserisco in lista + m_CsvPartList.Add(OnePart) + Next + EgtLuaResetGlobVar("CSV") + ' Ordinamento lista dei pezzi + m_CsvPartList.Sort(Function(x, y) + If Math.Abs(x.m_dTh - y.m_dTh) < EPS_SMALL Then + Return x.m_nOriInd < y.m_nOriInd + Else + Return x.m_dTh < y.m_dTh + End If + End Function) + Return True + End Function + + Private Sub ShowTreeView() + ' Path del file Csv + Dim TempPath As New Text.StringBuilder(260) + PathCompactPathEx(TempPath, m_sCsvPath, 22, 0) + CsvPathTxBl.Content = TempPath.ToString() + ' Pezzi del file Csv + m_ItemsList.Clear() + Dim dCurrTh As Double = 0 + Dim PartCathegory As PartCathegoryItem + For i As Integer = 1 To m_CsvPartList.Count() + Dim CurrPart As CsvPart = m_CsvPartList(i - 1) + If i = 1 Or Math.Abs(dCurrTh - CurrPart.m_dTh) > 10 * EPS_SMALL Then + dCurrTh = CurrPart.m_dTh + PartCathegory = New PartCathegoryItem("Spessore " & LenToString(CurrPart.m_dTh, 2), 0) + PartCathegory.IsExpanded = True + m_ItemsList.Add(PartCathegory) + End If + Dim sCount As String = CurrPart.m_nToNest.ToString() & "/" & CurrPart.m_nCount.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 + End Sub + + Private Sub PartsTreeView_PreviewMouseUp(sender As Object, e As MouseButtonEventArgs) Handles PartsTreeView.PreviewMouseUp + If TypeOf PartsTreeView.SelectedItem Is PartCathegoryItem Then + Dim SelectedCathegory As PartCathegoryItem = PartsTreeView.SelectedItem + SelectedCathegory.IsExpanded = Not SelectedCathegory.IsExpanded + If SelectedCathegory.IsExpanded Then + SelectedCathegory.IsSelected = False + End If + ElseIf TypeOf PartsTreeView.SelectedItem Is PartCustomItem Then + Dim SelectedCustom As PartCustomItem = PartsTreeView.SelectedItem + SelectedCustom.bIsActive = Not SelectedCustom.bIsActive + m_CsvPartList(SelectedCustom.nType - 1).m_bActive = SelectedCustom.bIsActive + End If + End Sub + + 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 And + (String.IsNullOrWhiteSpace(CurrPart.m_sMaterial) Or + String.IsNullOrWhiteSpace(sCurrMat) Or + String.Compare(CurrPart.m_sMaterial, sCurrMat, True)) Then + InsPartList.Add(CurrPart) + End If + Next + ' Lancio l'inserimento dei pezzi + ExecInsert(InsPartList) + ' Aggiorno visualizzazione + EgtDraw() + ' Aggiorno TreeView + ShowTreeView() + End Sub + + Private Function ExecInsert(InsPartList As List(Of CsvPart)) + ' Ordino la lista dei pezzi secondo le Y decrescenti + InsPartList.Sort(Function(x, y) + If Math.Abs(x.m_dDimY - y.m_dDimY) < EPS_SMALL Then + Return x.m_nOriInd < y.m_nOriInd + Else + Return x.m_dDimY > y.m_dDimY + End If + End Function) + ' 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) + ' Definizione variabili + EgtLuaSetGlobNumVar("CMP.V1", Math.Max(CurrPart.m_dDimX, CurrPart.m_dDimY)) + EgtLuaSetGlobNumVar("CMP.V2", Math.Min(CurrPart.m_dDimX, CurrPart.m_dDimY)) + EgtLuaSetGlobStringVar("CMP.INFO", CurrPart.m_sName) + ' Esecuzione componente + If Not EgtLuaExecLine("CMP_Draw(false)") Then Return False + ' Recupero Id del nuovo componente + Dim nId As Integer = EgtGetLastPart() + If nId = GDB_ID.NULL Then Return False + 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) + ' Aggiusto per lavorazioni + AdjustFlatPart(nId) + ' Lo sposto nel gruppo speciale + EgtRelocate(nId, nIpGrp) + Next + EgtLuaResetGlobVar("CMP") + EgtLuaResetGlobVar("CMP_Draw") + ' recupero dimensioni del grezzo e kerf + m_nRawId = EgtGetFirstRawPart() + GetRawBox(m_ptRawMin, m_ptRawMax) + ' 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 PackOnePart(CurrPart.m_nId) Then + CurrPart.m_nToNest -= 1 + Else + Exit While + End If + End While + Next + Return True + End Function + + Private Function PackOnePart(nId As Integer) + ' Dimensioni del pezzo + Dim ptPartMin, ptPartMax As Point3d + If Not EgtGetBBox(nId, GDB_BB.IGNORE_DIM + GDB_BB.IGNORE_TEXT, ptPartMin, ptPartMax) Then Return False + Dim dPartLen As Double = ptPartMax.x - ptPartMin.x + Dim dPartHeight As Double = ptPartMax.y - ptPartMin.y + ' Centro del grezzo + Dim nRawCenId = EgtGetFirstNameInGroup(m_nRawId, "RawCenter") + Dim ptRawCenter As Point3d + EgtStartPoint(nRawCenId, GDB_ID.ROOT, ptRawCenter) + Dim dRawCenX = ptRawCenter.x - m_ptRawMin.x + Dim dRawCenY = ptRawCenter.y - m_ptRawMin.y + ' Inserisco il pezzo nel grezzo, in centro in XY e in alto in Z + Dim ptP As New Point3d(dRawCenX - 0.5 * dPartLen, dRawCenY - 0.5 * dPartHeight, m_ptRawMax.z - m_ptRawMin.z) + ' Ne creo una copia nella radice + Dim nId2 As Integer = EgtCopyGlob(nId, GDB_ID.ROOT) + If EgtAddPartToRawPart(nId2, ptP, m_nRawId) Then + ' Aggiungo le lavorazioni standard + AddMachinings(nId2, True, False) + ' Eseguo nesting + Dim bFit As Boolean = False + If m_MainWindow.m_CadCutPageUC.m_NestPage.UpdateNestRegions() Then + If Not EgtExistsInfo(m_nRawId, KEY_RAWBYPOINTS) Then + bFit = EgtPackPartInRectangle(nId2, True, True) + End If + If Not bFit Then + bFit = EgtPackPart(nId2, True, True) + End If + End If + ' Gestione risultato nesting + If bFit Then + Return True + Else + EgtRemovePartFromRawPart(nId2) + EgtErase(nId2) + End If + End If + Return False + End Function + + Friend Sub SaveCsvPartList() + ' Path del file + Dim sFile As String = m_MainWindow.GetCsvAutoDir() & "\CsvPartList.ini" + ' Gestione file + Try + ' Apro file + Dim Writer As New IO.StreamWriter(sFile, False) + ' Intestazione + Writer.WriteLine("[General]") + Writer.WriteLine("Path=" & m_sCsvPath) + ' Ciclo sui pezzi + For i As Integer = 1 To m_CsvPartList.Count() + Dim CurrPart As CsvPart = m_CsvPartList(i - 1) + Writer.WriteLine("[P" & i.ToString() & "]") + Writer.WriteLine("Nam=" & CurrPart.m_sName) + Writer.WriteLine("Mat=" & CurrPart.m_sMaterial) + Writer.WriteLine("Act=" & If(CurrPart.m_bActive, "1", "0")) + Writer.WriteLine("Cnt=" & CurrPart.m_nCount.ToString()) + Writer.WriteLine("ToN=" & CurrPart.m_nToNest.ToString()) + Writer.WriteLine("Rct=" & If(CurrPart.m_bIsRect, "1", "0")) + Writer.WriteLine("DX=" & DoubleToString(CurrPart.m_dDimX, 4)) + Writer.WriteLine("DY=" & DoubleToString(CurrPart.m_dDimY, 4)) + Writer.WriteLine("Th=" & DoubleToString(CurrPart.m_dTh, 4)) + Writer.WriteLine("OIn=" & CurrPart.m_nOriInd.ToString()) + Next + ' Terminatore + Writer.WriteLine("[END]") + ' Chiudo file + Writer.Close() + ' Errore + Catch ex As Exception + EgtOutLog("Error writing " & sFile) + End Try + End Sub + + Private Sub LoadCsvPartList() + ' Pulisco path e lista dei pezzi Csv + m_sCsvPath = String.Empty + m_CsvPartList.Clear() + ' Path del file + Dim sFile As String = m_MainWindow.GetCsvAutoDir() & "\CsvPartList.ini" + ' Gestione file + Try + ' Apro file + Dim Reader As New IO.StreamReader(sFile, False) + ' Lettura intestazione + Dim sLine As String = Reader.ReadLine() + While sLine <> Nothing + If sLine = "[General]" Then + ' non devo fare alcunché + ElseIf sLine.Length() >= 5 AndAlso sLine.Substring(0, 5) = "Path=" Then + Dim sItems() As String = sLine.Split("=".ToCharArray) + If sItems.Count() >= 2 Then + m_sCsvPath = sItems(1) + End If + Else + Exit While + End If + sLine = Reader.ReadLine() + End While + ' Ciclo di lettura dei pezzi + Dim nI As Integer = 1 + Dim sPart As String = "[P" & nI.ToString() & "]" + Dim OnePart As New CsvPart + While sLine <> Nothing + ' Inizio pezzo o fine del file + If sLine = sPart Or sLine = "[END]" Then + ' se esiste pezzo precedente, lo salvo + If nI > 1 Then + ' inserisco in lista + m_CsvPartList.Add(OnePart) + End If + ' predisposizioni per prossimo pezzo + nI += 1 + sPart = "[P" & nI.ToString() & "]" + OnePart = New CsvPart + ' Dato + Else + Dim sItems() As String = sLine.Split("=".ToCharArray) + If sItems.Count() >= 2 Then + If sItems(0) = "Nam" Then + OnePart.m_sName = sItems(1) + ElseIf sItems(0) = "Mat" Then + OnePart.m_sMaterial = sItems(1) + ElseIf sItems(0) = "Act" Then + OnePart.m_bActive = If(sItems(1) = "0", False, True) + ElseIf sItems(0) = "Cnt" Then + OnePart.m_nCount = Int(sItems(1)) + ElseIf sItems(0) = "ToN" Then + OnePart.m_nToNest = Int(sItems(1)) + ElseIf sItems(0) = "Rct" Then + OnePart.m_bIsRect = If(sItems(1) = "0", False, True) + ElseIf sItems(0) = "DX" Then + StringToDouble(sItems(1), OnePart.m_dDimX) + ElseIf sItems(0) = "DY" Then + StringToDouble(sItems(1), OnePart.m_dDimY) + ElseIf sItems(0) = "Th" Then + StringToDouble(sItems(1), OnePart.m_dTh) + ElseIf sItems(0) = "OIn" Then + OnePart.m_nOriInd = Int(sItems(1)) + End If + End If + End If + sLine = Reader.ReadLine() + End While + ' Chiudo il file + Reader.Close() + ' Errore + Catch ex As Exception + EgtOutLog("Error reading " & sFile) + End Try + End Sub + + '----------------------------------------------------------------------------------------------- + Private Class CsvPart + Public m_sName As String + Public m_sMaterial As String + Public m_bActive As Boolean + Public m_nCount As Integer + Public m_nToNest As Integer + Public m_bIsRect As Boolean + Public m_dDimX As Double + Public m_dDimY As Double + Public m_dTh As Double + Public m_nOriInd As Integer + Public m_nId As Integer = GDB_ID.NULL + End Class + +End Class diff --git a/CadCutPageUC.xaml.vb b/CadCutPageUC.xaml.vb index 916b01b..94ba24a 100644 --- a/CadCutPageUC.xaml.vb +++ b/CadCutPageUC.xaml.vb @@ -13,6 +13,7 @@ Public Class CadCutPageUC Friend WithEvents m_NestPage As NestPageUC Friend m_SplitPage As SplitPageUC Friend m_MoveRawPartPage As MoveRawPartPage + Friend m_CSVPage As CSVPage Friend m_ProjectMgr As ProjectMgrUC '' Riferimento alla finestra di salvataggio con nome @@ -37,6 +38,7 @@ Public Class CadCutPageUC m_NestPage = New NestPageUC m_SplitPage = New SplitPageUC m_MoveRawPartPage = New MoveRawPartPage + m_CSVPage = New CSVPage m_ProjectMgr = New ProjectMgrUC ' Posizionamento nella griglia delle Page UserControl @@ -46,6 +48,8 @@ Public Class CadCutPageUC m_SplitPage.SetValue(Grid.ColumnSpanProperty, 3) m_MoveRawPartPage.SetValue(Grid.RowSpanProperty, 3) m_MoveRawPartPage.SetValue(Grid.ColumnSpanProperty, 3) + m_CSVPage.SetValue(Grid.RowSpanProperty, 3) + m_CSVPage.SetValue(Grid.ColumnSpanProperty, 3) m_ProjectMgr.SetValue(Grid.RowProperty, 2) m_ProjectMgr.SetValue(Grid.ColumnProperty, 1) @@ -55,6 +59,8 @@ Public Class CadCutPageUC Private Sub CadCutPage_Loaded(sender As Object, e As RoutedEventArgs) m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC + ' Visualizzo bottone CSV + m_ProjectMgr.CSVBtn.Visibility = Windows.Visibility.Visible ' Seleziono UserControl di apertura CadCutPageGrid.Children.Add(m_NestPage) m_CadCutMode = CadCutModes.Nest diff --git a/ConstGen.vb b/ConstGen.vb index 23003a7..3cab42d 100644 --- a/ConstGen.vb +++ b/ConstGen.vb @@ -37,6 +37,8 @@ Module ConstGen Public Const TEMP_DIR As String = "Temp" ' Sottodirettorio per Cam automatico Public Const CAMAUTO_DIR As String = "CamAuto" + ' Sottodirettorio per Csv automatico + Public Const CSVAUTO_DIR As String = "CsvAuto" ' Sottodirettorio per file Cnc Public Const CNC_DIR As String = "CNC" ' Sottodirettorio di default per il salvataggio diff --git a/ConstIni.vb b/ConstIni.vb index 388b18f..79fcdf9 100644 --- a/ConstIni.vb +++ b/ConstIni.vb @@ -92,6 +92,9 @@ Module ConstIni Public Const K_RESTRADIUS As String = "RestRadius" Public Const K_SNAPDIST As String = "SnapDist" + Public Const S_CSV As String = "Csv" + Public Const K_CSVCURRDIR As String = "CurrDir" + Public Const S_FRAME As String = "Frame" Public Const K_OFFSZ As String = "OffsZ" Public Const K_OFFSXY As String = "OffsXY" diff --git a/ConstMsg.vb b/ConstMsg.vb index 5fa6c6e..52f6ce5 100644 --- a/ConstMsg.vb +++ b/ConstMsg.vb @@ -28,5 +28,6 @@ Public Const MSG_MACHINECNPAGEUC As Integer = MSG_OMAGCUT + 930 Public Const MSG_OPTIONSPAGEUC As Integer = MSG_OMAGCUT + 950 Public Const MSG_EGTMSGBOX As Integer = MSG_OMAGCUT + 1100 + Public Const MSG_CSVPAGEUC As Integer = MSG_OMAGCUT + 1200 End Module diff --git a/FrameCutPageUC.xaml.vb b/FrameCutPageUC.xaml.vb index fb1dac5..850f76d 100644 --- a/FrameCutPageUC.xaml.vb +++ b/FrameCutPageUC.xaml.vb @@ -72,6 +72,8 @@ Public Class FrameCutPageUC m_CurrProjPage = m_MainWindow.m_CurrentProjectPageUC m_CurrMachine = m_MainWindow.m_CurrentMachine m_bActive = True + ' Nascondo bottone CSV + m_ProjectMgr.CSVBtn.Visibility = Windows.Visibility.Hidden ' Recupero dimensioni e kerf del grezzo m_nRawId = EgtGetFirstRawPart() GetRawBox(m_RawBox) diff --git a/MainWindow.xaml.vb b/MainWindow.xaml.vb index ba4d72e..8b7876f 100644 --- a/MainWindow.xaml.vb +++ b/MainWindow.xaml.vb @@ -90,6 +90,7 @@ Class MainWindow RawPart Draw Import + CSV Simulation FrameCut Machine @@ -121,6 +122,10 @@ Class MainWindow Return m_sDataRoot & "\" & CAMAUTO_DIR End Function + Public Function GetCsvAutoDir() As String + Return m_sDataRoot & "\" & CSVAUTO_DIR + End Function + Public Function GetCopyTemplateDir() As String Return m_sCopyTemplateDir End Function @@ -389,7 +394,7 @@ Class MainWindow MainWindowGrid.Children.Remove(m_CurrentProjectPageUC) MainWindowGrid.Children.Add(m_WorkInProgressPageUC) m_ActivePage = Pages.WorkInProgress - Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.Simulation + Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.CSV, Pages.Simulation WorkInProgressBtn.IsChecked = False CadCutBtn.IsChecked = True Case Pages.FrameCut @@ -437,7 +442,7 @@ Class MainWindow m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Remove(m_CadCutPageUC) m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_DirectCutPageUC) m_ActivePage = Pages.DirectCut - Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.Simulation + Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.CSV, Pages.Simulation DirectCutBtn.IsChecked = False CadCutBtn.IsChecked = True Case Pages.FrameCut @@ -486,7 +491,7 @@ Class MainWindow m_ActivePage = Pages.CadCut Case Pages.CadCut CadCutBtn.IsChecked = True - Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.Simulation + Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.CSV, Pages.Simulation CadCutBtn.IsChecked = True Case Pages.FrameCut CadCutBtn.IsChecked = True @@ -538,7 +543,7 @@ Class MainWindow m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Remove(m_CadCutPageUC) m_CurrentProjectPageUC.CurrentProjectPageGrid.Children.Add(m_FrameCutPageUC) m_ActivePage = Pages.FrameCut - Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.Simulation + Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.CSV, Pages.Simulation CadCutBtn.IsChecked = True FrameCutBtn.IsChecked = False Case Pages.FrameCut @@ -588,7 +593,7 @@ Class MainWindow MainWindowGrid.Children.Remove(m_CurrentProjectPageUC) MainWindowGrid.Children.Add(m_MachinePageUC) m_ActivePage = Pages.Machine - Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.Simulation + Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.CSV, Pages.Simulation CadCutBtn.IsChecked = True MachineBtn.IsChecked = False Case Pages.FrameCut @@ -631,16 +636,7 @@ Class MainWindow MainWindowGrid.Children.Remove(m_CurrentProjectPageUC) MainWindowGrid.Children.Add(m_OptionsPageUC) m_ActivePage = Pages.Options - Case Pages.Photo, Pages.RawPart - CadCutBtn.IsChecked = True - OptionsBtn.IsChecked = False - Case Pages.Simulation - CadCutBtn.IsChecked = True - OptionsBtn.IsChecked = False - Case Pages.Draw - CadCutBtn.IsChecked = True - OptionsBtn.IsChecked = False - Case Pages.Import + Case Pages.Photo, Pages.RawPart, Pages.Draw, Pages.Import, Pages.CSV, Pages.Simulation CadCutBtn.IsChecked = True OptionsBtn.IsChecked = False Case Pages.FrameCut @@ -711,6 +707,8 @@ Class MainWindow End If ' Uscita da pagina corrente definizione grezzo If Not ExitFromRaw() Then Return + ' Uscita da pagina corrente CSV + If Not ExitFromCsv() Then Return ' Uscita da pagina corrente di split If Not ExitFromSplit() Then Return ' Uscita da pagina corrente di simulazione @@ -737,6 +735,12 @@ Class MainWindow Return m_RawPartPage.ExitRawPart(True) End Function + Private Function ExitFromCsv() As Boolean + ' Salvo lo stato attuale della lista + m_CadCutPageUC.m_CSVPage.SaveCsvPartList() + Return True + End Function + Private Function ExitFromSplit() As Boolean ' Se non sono in split tutto ok If m_ActivePage <> Pages.CadCut Or m_CadCutPageUC.m_CadCutMode = CadCutPageUC.CadCutModes.Nest Then Return True diff --git a/My Project/AssemblyInfo.vb b/My Project/AssemblyInfo.vb index 7fedd45..1564411 100644 --- a/My Project/AssemblyInfo.vb +++ b/My Project/AssemblyInfo.vb @@ -60,5 +60,5 @@ Imports System.Windows ' by using the '*' as shown below: ' - - + + diff --git a/NestPageUC.xaml.vb b/NestPageUC.xaml.vb index a881504..aab92b0 100644 --- a/NestPageUC.xaml.vb +++ b/NestPageUC.xaml.vb @@ -398,7 +398,7 @@ Public Class NestPageUC ' Eseguo nesting Dim bFit As Boolean = False If UpdateNestRegions() Then - If Not EgtExistsInfo(m_CurrProjPage.m_nRawId, KEY_RAWBYPOINTS) Then + If Not EgtExistsInfo(m_nRawId, KEY_RAWBYPOINTS) Then bFit = EgtPackPartInRectangle(nId, m_bReducedCut, True) End If If Not bFit Then diff --git a/OmagCUT.vbproj b/OmagCUT.vbproj index 87bbe32..f94c0dd 100644 --- a/OmagCUT.vbproj +++ b/OmagCUT.vbproj @@ -147,6 +147,9 @@ CopyTemplateUC.xaml + + CSVPage.xaml + CurrentProjectPageUC.xaml @@ -190,6 +193,9 @@ NestPageUC.xaml + + OpenFileWD.xaml + OpenPageUC.xaml @@ -287,6 +293,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -339,6 +349,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + MSBuild:Compile Designer diff --git a/OmagCUTDictionary.xaml.vb b/OmagCUTDictionary.xaml.vb index c99e4fe..f1b9155 100644 --- a/OmagCUTDictionary.xaml.vb +++ b/OmagCUTDictionary.xaml.vb @@ -117,6 +117,117 @@ Namespace TreeViewItem End Class + Public Class PartCathegoryItem + Inherits TreeViewItemBase + + 'Private m_sTitle As String + Private m_sPictureString As String + Private m_nFType As Integer + Private m_Items As ObservableCollection(Of PartCustomItem) + + 'Public Property Name As String + ' Get + ' Return m_sTitle + ' End Get + ' Set(value As String) + ' m_sTitle = value + ' End Set + 'End Property + + Public ReadOnly Property PictureString As String + Get + Return "/Resources/ToolsTreeViewImages/Lama.png" + End Get + End Property + + Public ReadOnly Property nFType As Integer + Get + Return m_nFType + End Get + End Property + + Public Property Items As ObservableCollection(Of PartCustomItem) + Get + Return m_Items + End Get + Set(value As ObservableCollection(Of PartCustomItem)) + m_Items = value + End Set + End Property + + Sub New(sName As String, nType As Integer) + Name = sName + m_nFType = nType + Me.Items = New ObservableCollection(Of PartCustomItem) + End Sub + + End Class + + Public Class PartCustomItem + Inherits TreeViewItemBase + + 'Private m_sTitle As String + Private m_nType As Integer + Private m_bIsActive As Boolean + Private m_sText1 As String + Private m_sText2 As String + + Public Property sText1 As String + Get + Return m_sText1 + End Get + Set(value As String) + m_sText1 = value + NotifyPropertyChanged("sText1") + End Set + End Property + + Public Property sText2 As String + Get + Return m_sText2 + End Get + Set(value As String) + m_sText2 = value + NotifyPropertyChanged("sText2") + End Set + End Property + + Public ReadOnly Property nType As Integer + Get + Return m_nType + End Get + End Property + + Public Property bIsActive As Boolean + Get + Return m_bIsActive + End Get + Set(value As Boolean) + If value <> m_bIsActive Then + m_bIsActive = value + NotifyPropertyChanged("bIsActive") + End If + End Set + End Property + + Sub New(Title As String, nType As Integer, sText1 As String, sText2 As String) + Me.Name = Title + m_nType = nType + m_sText1 = sText1 + m_sText2 = sText2 + m_bIsActive = True + End Sub + + Sub New(Title As String, nType As Integer, sText1 As String, sText2 As String, bIsActive As Boolean) + Me.Name = Title + m_nType = nType + m_sText1 = sText1 + m_sText2 = sText2 + m_bIsActive = bIsActive + End Sub + + End Class + Public Class TreeViewItemBase Implements INotifyPropertyChanged diff --git a/OpenFileWD.xaml b/OpenFileWD.xaml new file mode 100644 index 0000000..e993a7c --- /dev/null +++ b/OpenFileWD.xaml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenFileWD.xaml.vb b/OpenFileWD.xaml.vb new file mode 100644 index 0000000..d4b6a1c --- /dev/null +++ b/OpenFileWD.xaml.vb @@ -0,0 +1,159 @@ +Imports System.Collections.ObjectModel +Imports System.IO +Imports EgtUILib + +Public Class OpenFileWD + + ' Properties + Private m_sCurrDir As String = String.Empty + Private m_sCurrFile As String = String.Empty + Private m_sExt As String = String.Empty + + Private m_OpenItemList As New ObservableCollection(Of IconListBoxItem) + + Sub New(Owner As Window, sDir As String, sExt As String) + Me.Owner = Owner + m_sCurrDir = sDir + m_sExt = sExt + InitializeComponent() + End Sub + + Private Sub OpenFile_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized + ' Posizione finestra + Me.Top = Owner.Top + Owner.Height / 2 - Me.Height / 2 + Me.Left = Owner.Left + Owner.Width / 2 - Me.Width / 2 + ' Definizione del collegamento tra ItemList e ListBox1 + FileListBox.ItemsSource = m_OpenItemList + End Sub + + Private Sub OpenFile_Loaded(sender As Object, e As EventArgs) Handles Me.Loaded + ' carico direttorio + LoadCurrDir() + ' disabilito ok + OkBtn.IsEnabled = False + End Sub + + Private Function LoadCurrDir() As Boolean + ' se direttorio corrente non valido, carico l'elenco dei dischi + If String.IsNullOrWhiteSpace(m_sCurrDir) OrElse Not IO.Directory.Exists(m_sCurrDir) Then + Return LoadDisks() + End If + Dim TempPath As New Text.StringBuilder(260) + PathCompactPathEx(TempPath, m_sCurrDir, 28, 0) + ' lo visualizzo + FilePathTxBl.Content = TempPath.ToString + ' pulisco la lista + m_OpenItemList.Clear() + ' per risalire al direttorio padre + m_OpenItemList.Add(New IconListBoxItem("..", 0)) + ' elenco dei sottodirettori + Dim DirInfo As New DirectoryInfo(m_sCurrDir) + Dim vDirI As DirectoryInfo() = DirInfo.GetDirectories("*") + Dim DirI As DirectoryInfo + For Each DirI In vDirI + ' per saltare i link, troppo complessi da gestire + If (DirI.Attributes And FileAttributes.Hidden) <> FileAttributes.Hidden Or + (DirI.Attributes And FileAttributes.System) <> FileAttributes.System Then + m_OpenItemList.Add(New IconListBoxItem(DirI.Name, 2)) + End If + Next + ' elenco dei file + Dim vFileI As FileInfo() = DirInfo.GetFiles() + Dim FileI As FileInfo + For Each FileI In vFileI + Dim sExt As String = Path.GetExtension(FileI.Name).ToUpper() + If sExt = m_sExt Then + m_OpenItemList.Add(New IconListBoxItem(FileI.Name, 3)) + End If + Next + ' riporto visualizzazione in cima alla lista (esiste sempre almeno un elemento) + FileListBox.ScrollIntoView(m_OpenItemList(0)) + Return True + End Function + + Private Function LoadDisks() As Boolean + ' dir corrente vuoto + m_sCurrDir = "" + ' lo visualizzo + FilePathTxBl.Content = m_sCurrDir + ' pulisco la lista + m_OpenItemList.Clear() + ' elenco dei dischi + Dim vDriI As DriveInfo() = DriveInfo.GetDrives() + Dim DriI As DriveInfo + For Each DriI In vDriI + m_OpenItemList.Add(New IconListBoxItem(DriI.Name, 1)) + Next + Return True + End Function + + Private Sub FileListBox_PreviewMouseUp(sender As Object, e As MouseButtonEventArgs) Handles FileListBox.PreviewMouseUp + ' Disabilito Ok + OkBtn.IsEnabled = False + + ' Recupero item selezionato + If FileListBox.SelectedItems.Count() = 0 Then + Return + End If + + Dim vItems As IconListBoxItem = FileListBox.SelectedItems(0) + ' A seconda del tipo + Select Case vItems.PictureID + Case 0 ' Vai nel direttorio padre + m_sCurrDir = IO.Path.GetDirectoryName(m_sCurrDir) + m_sCurrFile = "" + LoadCurrDir() + Case 1 ' Vai nella radice del disco + m_sCurrDir = vItems.Name + m_sCurrFile = "" + LoadCurrDir() + Case 2 ' Vai nel sottodirettorio + m_sCurrDir = IO.Path.Combine(m_sCurrDir, vItems.Name) + m_sCurrFile = "" + LoadCurrDir() + Case 3 ' File + m_sCurrFile = vItems.Name + OkBtn.IsEnabled = True + End Select + + End Sub + + Private Sub FileListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles FileListBox.SelectionChanged + ' Recupero item selezionato + If FileListBox.SelectedItems.Count() = 0 Then + Return + End If + + Dim vItems As IconListBoxItem = FileListBox.SelectedItems(0) + + ' Gestisco solo aggiornamento visualizzazione file + If vItems.PictureID = 3 Then + m_sCurrFile = vItems.Name + OkBtn.IsEnabled = True + Else + m_sCurrFile = "" + OkBtn.IsEnabled = False + End If + End Sub + + Private Sub OkBtn_Click(sender As Object, e As RoutedEventArgs) Handles OkBtn.Click + DialogResult = True + End Sub + + Friend Function GetFilePath() As String + If Not String.IsNullOrWhiteSpace(m_sCurrFile) Then + Return m_sCurrDir & "\" & m_sCurrFile + Else + Return "" + End If + End Function + + Friend Function GetFileDir() As String + If Not String.IsNullOrWhiteSpace(m_sCurrFile) Then + Return m_sCurrDir + Else + Return "" + End If + End Function + +End Class diff --git a/ProjectMgrUC.xaml b/ProjectMgrUC.xaml index 0a43ab2..6824da8 100644 --- a/ProjectMgrUC.xaml +++ b/ProjectMgrUC.xaml @@ -29,6 +29,8 @@