cf650891dc
- aggiunto import CSV (versione preliminare).
436 lines
18 KiB
VB.net
436 lines
18 KiB
VB.net
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
|