Files
Nicola Pievani d950fc1060 OmagVIEWPlus 2.2j1:
-> nuova definizione dei pezzi (classe Part)
-> nuova gestione dei magazzini
-> aggiunta pagina per la selezione dei pezzi manuali
-> nuova configurazione delle variabili.
2020-10-09 08:13:48 +00:00

529 lines
21 KiB
VB.net

Imports System.Collections.ObjectModel
Imports System.IO
Imports EgtUILib
Imports EgtWPFLib5
Module CsvM
' Dati lista
Private m_sCsvPath As String = String.Empty
Public ReadOnly Property CsvPath As String
Get
Return m_sCsvPath
End Get
End Property
Private m_CsvPartList As New List(Of CsvPart)
Public ReadOnly Property CsvPartList As List(Of CsvPart)
Get
Return m_CsvPartList
End Get
End Property
Private m_bCsvPartListModified As Boolean = False
Private m_sCompoDir As String = String.Empty
#Region "METHODS"
Public Sub InitCsvM()
' Leggo direttorio componenti
GetMainPrivateProfileString(S_COMPO, K_COMPODIR, "", m_sCompoDir)
' Leggo lista pezzi corrente
Dim sCsvFile As String = String.Empty
GetMainPrivateProfileString(S_CSV, K_CSVLASTFILE, "", sCsvFile)
If Not String.IsNullOrEmpty(sCsvFile) Then
LoadCsvPartList(sCsvFile)
End If
End Sub
Public Sub NewCmd()
' Salvo lista dei pezzi attuale (se modificata)
If Not SaveCsvPartList() Then
' Errore nel salvataggio del file CSV, vuoi continuare lo stesso ? - Errore
If MessageBox.Show(EgtMsg(MSG_CSVPAGEUC + 5), EgtMsg(MSG_MESSAGEBOX + 1), MessageBoxButton.YesNo, MessageBoxImage.Error) <> MessageBoxResult.Yes Then
Return
End If
End If
' Pulisco path e lista dei pezzi Csv
m_sCsvPath = String.Empty
m_CsvPartList.Clear()
m_bCsvPartListModified = False
' Registro in ini nessuna path
WriteMainPrivateProfileString(S_CSV, K_CSVLASTFILE, "")
End Sub
Public Sub Open()
' Salvo lista dei pezzi attuale (se modificata)
If Not SaveCsvPartList() Then
' Errore nel salvataggio del file CSV, vuoi continuare lo stesso ? - Errore
If MessageBox.Show(EgtMsg(MSG_CSVPAGEUC + 5), EgtMsg(MSG_MESSAGEBOX + 1), MessageBoxButton.YesNo, MessageBoxImage.Error) <> MessageBoxResult.Yes Then
Return
End If
End If
' Leggo direttorio corrente dei file CSV
Dim sCurrDir As String = ""
GetMainPrivateProfileString(S_CSV, K_CSVCURRDIR, "C:\", sCurrDir)
' Apro dialogo scelta file
Dim CsvFileDlg As New Microsoft.Win32.OpenFileDialog()
If Directory.Exists(sCurrDir) Then CsvFileDlg.InitialDirectory = sCurrDir
CsvFileDlg.Filter = "Csv file|*.Csv|Epl file|*.Epl"
If Not CsvFileDlg.ShowDialog() Then Return
' Salvo direttorio corrente
WriteMainPrivateProfileString(S_CSV, K_CSVCURRDIR, Path.GetDirectoryName(CsvFileDlg.FileName))
' Apertura file
Dim sPath = CsvFileDlg.FileName
If String.Compare(Path.GetExtension(sPath), ".CSV", True) = 0 Then
LoadCsvFile(sPath)
Else
LoadCsvPartList(sPath)
End If
End Sub
Public Sub Insert()
' Recupero lo spessore della lastra corrente
Dim dRawHeight As Double = EstCalc.GetRawHeight()
If dRawHeight < EPS_SMALL Then Return
' Recupero il materiale della lastra corrente
Dim sCurrMat As String = String.Empty
If Not IsNothing(CurrentMachine.CurrMat) Then
sCurrMat = 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
sCurrMat = "***" Or
String.Compare(CurrPart.m_sMaterial, sCurrMat, True) = 0) Then
InsPartList.Add(CurrPart)
End If
Next
' Lancio l'inserimento dei pezzi
ExecInsert(InsPartList)
' Dichiaro lista modificata
m_bCsvPartListModified = True
' Aggiorno visualizzazione
EgtDraw()
End Sub
Private Function ExecInsert(InsPartList As List(Of CsvPart)) As Boolean
Dim bMaxDimOnX As Boolean = (GetMainPrivateProfileInt(S_CSV, K_MAXDIMONX, 1) <> 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)
' 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 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)
' 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( 0, 0, 0))
End If
' Aggiusto per lavorazioni
AdjustFlatPart(nId)
' Aggiungo info su CSV di origine
EgtSetInfo(nId, INFO_CSV_PATH, m_sCsvPath)
EgtSetInfo(nId, INFO_CSV_PART, CurrPart.m_sName)
EgtSetInfo(nId, INFO_CSV_ORD, CurrPart.m_sOrd)
EgtSetInfo(nId, INFO_CSV_DIST, CurrPart.m_sDist)
EgtSetInfo(nId, INFO_CSV_MAT, CurrPart.m_sMaterial)
' Imposto colore testi
EstCalc.SetTextColor( nRegId)
' Lo sposto nel gruppo speciale
EgtRelocate(nId, nIpGrp)
Next
EgtLuaResetGlobVar("CMP")
EgtLuaResetGlobVar("CMP_Draw")
' Provo ad inserire i pezzi
Dim bDirect As Boolean = (GetMainPrivateProfileInt(S_CSV, K_CSVDIRECT, 1) <> 0)
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, bDirect) Then
CurrPart.m_nToNest -= 1
Else
Exit While
End If
End While
Next
Return True
End Function
Private Function PackOnePart(nId As Integer, bDirect As Boolean) As Boolean
' Creo una copia del pezzo nella radice
Dim nId2 As Integer = EgtCopyGlob(nId, GDB_ID.ROOT)
If nId2 = GDB_ID.NULL Then Return False
' Lo inserisco direttamente
If bDirect Then
' Aggiungo riferimento e lo inserisco in VeinMatching
VeinMatching.SetRefOnPart(nId2)
VeinMatching.AddPart(nId2, True)
' Provo inserimento in lastra
If EstCalc.InsertOnePart(nId2, CurrentMachine.bAligned, CurrentMachine.bReducedCut) Then
' Eventuale notifica al VeinMatching
VeinMatching.OnInsertPartInRaw(nId2)
Return True
Else
' Eventuale cancellazione per VM
VeinMatching.OnRemovePart(nId2)
' Cancellazione del pezzo
EraseMachinings(nId2)
EgtRemovePartFromRawPart(nId2)
EgtErase(nId2)
Return False
End If
' altrimenti lo metto in parcheggio
Else
' Aggiungo riferimento e lo inserisco in VeinMatching
VeinMatching.SetRefOnPart(nId2)
VeinMatching.AddPart(nId2, True)
' Inserisco in parcheggio
EstCalc.StoreOnePart(nId2, True)
Return True
End If
End Function
Public Sub Remove(ByRef bOther As Boolean, ByRef sOtherCsv As String)
' 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
' Dichiaro lista modificata
m_bCsvPartListModified = True
' Aggiorno visualizzazione
EgtDraw()
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 era nel grezzo
If EgtGetParent(nId) = EstCalc.GetRawId() Then
' Rimuovo le lavorazioni
EraseMachinings(nId)
' Rimuovo dal grezzo
EgtRemovePartFromRawPart(nId)
End If
' Eventuale cancellazione per VM
VeinMatching.OnRemovePart(nId)
' 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
Private Function LoadCsvFile(sCsvPath As String) As Boolean
' 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
Dim sReader As String = String.Empty
GetMainPrivateProfileString(S_CSV, K_READER, "CsvRead.lua", sReader)
If EgtLuaExecFile(OmagOFFICEMap.refMainWindowVM.MainWindowM.sCsvAutoDir & "\" & sReader) 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.ORD" & sN, OnePart.m_sOrd)
EgtLuaGetGlobStringVar("CSV.DIST" & sN, OnePart.m_sDist)
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 (ordine crescente su materiale e spessore)
m_CsvPartList.Sort(Function(x, y)
Dim nComp As Integer = String.Compare(x.m_sMaterial, y.m_sMaterial, True)
If nComp = 0 Then
If Math.Abs(x.m_dTh - y.m_dTh) < EPS_SMALL Then
Return (x.m_nOriInd - y.m_nOriInd)
Else
Return CInt(Math.Ceiling(x.m_dTh - y.m_dTh))
End If
Else
Return nComp
End If
End Function)
' Salvo come epl
m_bCsvPartListModified = True
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)
Return True
End Function
Public Function SaveCsvPartList() As Boolean
' Se non c'è nulla di attivo, non faccio alcunché
If String.IsNullOrEmpty(m_sCsvPath) Then
EgtOutLog("CSV List Save Skipped : missing")
Return True
End If
' Se lista non modificata, non faccio alcunchhé
If Not m_bCsvPartListModified Then
EgtOutLog("CSV List Save Skipped : not modified")
Return True
End If
' Path del file
Dim sFile As String = Path.ChangeExtension(m_sCsvPath, ".epl")
' 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("Ord=" & CurrPart.m_sOrd)
Writer.WriteLine("Dist=" & CurrPart.m_sDist)
Writer.WriteLine("Mat=" & CurrPart.m_sMaterial)
Writer.WriteLine("Act=" & If(CurrPart.m_bActive, "1", "0"))
Writer.WriteLine("Cnt=" & CurrPart.m_nCount.ToString())
Writer.WriteLine("Add=" & CurrPart.m_nAdd.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()
' Dichiaro lista non più modificata
m_bCsvPartListModified = False
' Registro in ini path
WriteMainPrivateProfileString(S_CSV, K_CSVLASTFILE, sFile)
Return True
' Errore
Catch ex As Exception
EgtOutLog("CSV List error writing " & sFile)
Return False
End Try
End Function
Private Function LoadCsvPartList(sFile As String) As Boolean
' Pulisco path e lista dei pezzi Csv
m_sCsvPath = String.Empty
m_CsvPartList.Clear()
' 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) = "Ord" Then
OnePart.m_sOrd = sItems(1)
ElseIf sItems(0) = "Dist" Then
OnePart.m_sDist = 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
StringToInt(sItems(1), OnePart.m_nCount)
ElseIf sItems(0) = "Add" Then
StringToInt(sItems(1), OnePart.m_nAdd)
ElseIf sItems(0) = "ToN" Then
StringToInt(sItems(1), OnePart.m_nToNest)
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
StringToInt(sItems(1), OnePart.m_nOriInd)
End If
End If
End If
sLine = Reader.ReadLine()
End While
' Chiudo il file
Reader.Close()
' Dichiaro lista non modificata
m_bCsvPartListModified = False
Return True
' Errore
Catch ex As Exception
EgtOutLog("Error reading " & sFile)
Return False
End Try
End Function
#End Region ' METHODS
End Module
Public Class CsvPart
Public m_sName As String = String.Empty
Public m_sOrd As String = String.Empty
Public m_sDist As String = String.Empty
Public m_sMaterial As String = String.Empty
Public m_bActive As Boolean = True
Public m_nCount As Integer = 0
Public m_nAdd As Integer = 0
Public m_nToNest As Integer = 0
Public m_bIsRect As Boolean = True
Public m_dDimX As Double = 0
Public m_dDimY As Double = 0
Public m_dTh As Double = 0
Public m_nOriInd As Integer = 0
Public m_nId As Integer = GDB_ID.NULL
End Class