-- -- EEEEEEEEEE GGGGGG TTTTTTTTTTTTTT -- EEEEEEEEEE GGGGGGGGGG TTTTTTTTTTTTTT -- EEEE GGGG GGGG TTTT -- EEEE GGGG TTTT -- EEEEEEE GGGG GGGGGGG TTTT -- EEEEEEE GGGG GGGGGGG TTTT -- EEEE GGGG GGGG TTTT -- EEEE GGGG GGGG TTTT -- EEEEEEEEEE GGGGGGGGGG TTTT -- EEEEEEEEEE GGGGGG TTTT -- -- by EgalTech s.r.l. -- Nesting manager by EgalTech s.r.l. 2020/08/13 -- necessary to find socket.core and mime.core package.cpath = package.cpath .. ";/EgtProg/LuaLibs/?.dll" package.cpath = package.cpath .. ";/EgtDevTest/LUAREST/32/?.lua" require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Imposto direttorio libreria specializzata per Nesting local sBaseDir = EgtGetSourceDir() EgtOutLog("BaseDir=" .. sBaseDir) EgtAddToPackagePath( sBaseDir .. '?.lua') local Config = require( 'Config') local UtilityLib = require( 'UtilityLib') local RESTLib = require( 'RESTLib') local NestingLib = require( 'NestingLib') local socket = require( 'socket') ------------------------------------------- PARAMETERS ------------------------------------------- local DebugCode = false local ProblematicItem = 138284 ------------------------------------------- ************** ------------------------------------------- local function ManageError(ErrorList, readBatch, Send) if #ErrorList > 0 then -- creo batch di risposta local answ = {} answ.BatchId = readBatch.BatchId answ.EnvNum = readBatch.EnvNum answ.ProcType = readBatch.ProcType answ.MachineType = readBatch.MachineType answ.OrderType = readBatch.OrderType answ.ProcessNotes = "" answ.EstimatedWorktime = 0 answ.DrawingPath = "" answ.PartList = {} answ.CNCPath = "" answ.SurfaceWork = 0 answ.SurfaceTotal = 0 answ.BunkList = {} answ.CartList = {} answ.BinList = {} answ.ErrorList = ErrorList answ.ProcessStatus = 2 answ.ProcessingRuntime = EgtStopCounter() / 1000 -- se doppia macchina if not Send and Config.bDoubleMach then return true, answ end -- invio dati local bOk = RESTLib.set(Config.sPathBatch, answ) if bOk then print("OK") end return true end return false end -- -- funzione che esegue nesting finale function Nesting(readBatch) -- imposto macchina in uso NestingLib.ManageMachine(false) -- elimino tutti i file presenti nella cartella nesting EgtEmptyDirectory(Config.sBasePath .. "/Nesting" ) EgtOutText("Nesting start") -- lista errori local ErrorList = {} -- conto tutto if not readBatch.OrderList then return end local OrderCount = #readBatch.OrderList local KitCount = 0 local PartCount = 0 local NoDXFCount = 0 local NoMaterialCount = 0 local NoMaterialCount2 = 0 for Order = 1, #readBatch.OrderList do KitCount = KitCount + #readBatch.OrderList[Order].KitList for Kit = 1, #readBatch.OrderList[Order].KitList do PartCount = PartCount + #readBatch.OrderList[Order].KitList[Kit].PartList end end -- recupero lista materiali local materials = RESTLib.get(Config.sPathMat) for MaterialIndex = 1, #materials do materials[MaterialIndex].PriorityList = {} end -- leggo materiali per tutti i pezzi, metto i verniciati con priorita' 1 sui materiali ed elimino ordini e kit dei verniciati local OrderList = {} local CalcReadBatch = RESTLib.get(Config.sPathBatch) if not CalcReadBatch or CalcReadBatch.BatchId == 0 then -- error!! end for OrderIndex = 1, #CalcReadBatch.OrderList do table.insert(OrderList, CalcReadBatch.OrderList[OrderIndex]) end NestingLib.FilterPaintedParts(OrderList, materials, ErrorList) -- raggruppo gli ordini simili per ottimizzare l'uso del materiale -- creo cart -- assegno priorita' ai pezzi e li divido sui materiali local Carts = {} -- lista dei cart -- creo cart a partire da lista ordini e kit -- NestingLib.CreateCart(readBatch, Carts) NestingLib.CreateCart(OrderList, Carts) local StartCartIndex = 0 if readBatch.NumIndexStart then StartCartIndex = readBatch.NumIndexStart end for CartIndex = 1, #Carts do Carts[CartIndex].CartIndex = StartCartIndex + CartIndex - 1 end -- se debug if DebugCode then -- verifico di aver messo tutti i kit sui cart local KitList = {} -- raccolgo tutti i kit dai cart in una lista for CartIndex = 1, #Carts do for OrderIndex = 1, #Carts[CartIndex].OrderList do for KitIndex = 1, #Carts[CartIndex].OrderList[OrderIndex].KitList do table.insert(KitList, Carts[CartIndex].OrderList[OrderIndex].KitList[KitIndex]) end end end -- aggiungo i kit dei painted for OrderIndex = 1, #OrderList do for KitIndex = 1, #OrderList[OrderIndex].KitList do if OrderList[OrderIndex].KitList[KitIndex].IsPaint then table.insert(KitList, OrderList[OrderIndex].KitList[KitIndex]) end end end -- passo i kit del readbatch for OrderIndex = 1, #readBatch.OrderList do for BKitIndex = 1, #readBatch.OrderList[OrderIndex].KitList do local bFound = false for VKitIndex = #KitList, 1, -1 do if readBatch.OrderList[OrderIndex].KitList[BKitIndex].KitId == KitList[VKitIndex].KitId then if not bFound then bFound = true table.remove(KitList, VKitIndex) else table.insert(ErrorList, {ErrType = "E.12", Uid = "KitId = " .. readBatch.OrderList[OrderIndex].KitList[BKitIndex].KitId, Description = "Kit duplicated after putting them on cart!"}) end end end if not bFound then table.insert(ErrorList, {ErrType = "E.12", Uid = "KitId = " .. readBatch.OrderList[OrderIndex].KitList[BKitIndex].KitId, Description = "Kit lost after putting them on cart!"}) end end end -- verifico se sono rimasti elementi nella tabella kit if #KitList > 0 then table.insert(ErrorList, {ErrType = "E.12", Uid = "KitId = " .. KitList[1].KitId, Description = #KitList .. " kit more than in batch request after putting kit on cart!"}) end end -- imposto priorità sui pezzi in base ai carrelli e li divido per materiale e priorità NestingLib.SetPriorityProcessMaterial(Carts, materials, ErrorList) -- se debug if DebugCode then -- verifico di aver messo tutti i part su un materiale local PartList = {} -- raccolgo tutti i part dai materiali in una lista for MaterialIndex = 1, #materials do for PriorityIndex = 1, #materials[MaterialIndex].PriorityList do for PartIndex = 1, #materials[MaterialIndex].PriorityList[PriorityIndex].PartList do table.insert(PartList, materials[MaterialIndex].PriorityList[PriorityIndex].PartList[PartIndex]) end end end -- passo i part del readbatch for OrderIndex = 1, #readBatch.OrderList do for KitIndex = 1, #readBatch.OrderList[OrderIndex].KitList do for BPartIndex = 1, #readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList do local bFound = false for VPartIndex = #PartList, 1, -1 do if readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList[BPartIndex].PartId == PartList[VPartIndex].PartId then if not bFound then bFound = true table.remove(PartList, VPartIndex) else table.insert(ErrorList, {ErrType = "E.12", Uid = "PartId = " .. readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList[BPartIndex].PartId, Description = "Part duplicated after distributing them on materials!"}) end end end if not bFound then table.insert(ErrorList, {ErrType = "E.12", Uid = "PartId = " .. readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList[BPartIndex].PartId, Description = "Part lost after distributing them on materials!"}) end end end end -- verifico se sono rimasti elementi nella tabella kit if #PartList > 0 then table.insert(ErrorList, {ErrType = "E.12", Uid = "PartId = " .. PartList[1].PartId, Description = #PartList .. " part more than in batch request after distributing them on materials!"}) end end -- creo bin necessari local Bins = {} NestingLib.CreateBin(materials, Bins) -- se debug if DebugCode then -- verifico di aver messo tutti i painted part su un bin end PartCount1 = 0 local MatIde = 21 -- local MatIndex = MatIde + 1 -- local MatCount = MatIndex local MatIndex = 1 local MatCount = #materials --for Material = 1, #materials do for Material = MatIndex, MatCount do --for Material = 2, 2 do for Priority = 1, #materials[Material].PriorityList do for Part = 1, #materials[Material].PriorityList[Priority].PartList do PartCount1 = PartCount1 + 1 if materials[Material].PriorityList[Priority].PartList[Part].PartId == ProblematicItem then local x = 2 end end end end -- contatore dei pezzi ricevuti per errori sul numero finale dei pezzi --local VPartList = {} --for Priority = 1, #materials[11].PartList do -- for Part = 1, #materials[11].PartList[Priority].PartList do -- table.insert(VPartList, materials[11].PartList[Priority].PartList[Part].PartId) -- end --end function comparePriority(a,b) return a.Priority < b.Priority end -- per ogni materiale riordino le priorita' local SortingArray = {} for MaterialIndex = 1, #materials do table.sort(materials[MaterialIndex].PriorityList, comparePriority) end -- per ogni materiale creo un progetto local PARTID = "PartId" local PRIORITY = "Priority" local ROUGHER = {".375 ROUGHER","ROUGHER"} local DTMXPOS = "DATA MATRIX CODE POSITION" local MatSheetList = {} --for Material = 1, #materials do for Material = MatIndex, MatCount do -- for Material = 15, 15 do --for Material = 4, 4 do -- se è il materiale nullo salto al prossimo if materials[Material].MatId ~= 0 and #materials[Material].PriorityList > 0 then EgtOutText("Material: " .. materials[Material].MatDesc) EgtNewFile() materials[Material].SheetList = {} local LastRawId = GDB_ID.NULL -- recupero lista verniciati (priorità 1) local PartToBeMachined = {} -- verifico se c'è lista pezzi verniciati -- if materials[Material].PartList[1].Priority == 1 then ---- PartToBeMachined = materials[Material].PartList[1].PartList -- PartToBeMachined = {} -- for Part = 1, #materials[Material].PartList[1].PartList do -- table.insert(PartToBeMachined, materials[Material].PartList[1].PartList[Part]) -- end -- -- chiamo il nesting sui verniciati -- LastRawId = NestingLib.NestPartInRawPart(nil, PartToBeMachined, materials[Material], ErrorList) -- -- recupero lista di pezzi di priorità più bassa -- if #materials[Material].PartList > 1 then ---- PartToBeMachined = materials[Material].PartList[2].PartList -- PartToBeMachined = {} -- for Part = 1, #materials[Material].PartList[2].PartList do -- table.insert(PartToBeMachined, materials[Material].PartList[2].PartList[Part]) -- end -- -- end -- -- riempio con questi -- LastRawId = NestingLib.NestPartInRawPart(LastRawId, PartToBeMachined, materials[Material], ErrorList) -- end -- for Index = 1, materials[Material].PartList do -- if materials[Material].PartList[Index].Priority == 1 then -- PartToBeMachined = materials[Material].PartList[Index].PartList -- end -- end -- for Index = 1, materials[Material].PartList do -- if materials[Material].PartList[Index].Priority == 2 then -- PartToBeMachined = materials[Material].PartList[Index].PartList -- end -- end -- -- riempio con quelli di priorità 2 -- LastRawId = NestingLib.NestPartInRawPart(LastRawId, PartToBeMachined, materials[Material]) -- se il primo gruppo ha priorita' 1, ne aggiungo i pezzi a quelli da nestare if materials[Material].PriorityList[1].Priority == 1 then for Part = 1, #materials[Material].PriorityList[1].PartList do table.insert(PartToBeMachined, materials[Material].PriorityList[1].PartList[Part]) if materials[Material].PriorityList[1].PartList[Part].PartId == ProblematicItem then local x = 2 end end end local Counter = true local PriorityCount = #materials[Material].PriorityList -- ciclo sulle priorità dei pezzi for Index = 1, PriorityCount do -- verifico che non siano i verniciati if materials[Material].PriorityList[Index].Priority ~= 1 then if Counter then -- annullo LastRaw perche' devo partire con un nuovo grezzo, altrimenti aggiungo pezzi sbagliati (riempimento gia' fatto!) LastRawId = GDB_ID.NULL for Part = 1, #materials[Material].PriorityList[Index].PartList do table.insert(PartToBeMachined, materials[Material].PriorityList[Index].PartList[Part]) if materials[Material].PriorityList[Index].PartList[Part].PartId == ProblematicItem then local x = 2 end end -- PartToBeMachined = materials[Material].PartList[Index].PartList else PartToBeMachined = {} for Part = 1, #materials[Material].PriorityList[Index].PartList do table.insert(PartToBeMachined, materials[Material].PriorityList[Index].PartList[Part]) if materials[Material].PriorityList[Index].PartList[Part].PartId == ProblematicItem then local x = 2 end end -- PartToBeMachined = materials[Material].PartList[Index].PartList end -- se Counter true faccio il nesting, se false completo grezzo -- verifico anche che non sia il primo giro in cui dovrei prima riempire i pannelli dei pezzi painted LastRawId = NestingLib.NestPartInRawPart(LastRawId, PartToBeMachined, materials[Material], ErrorList, false, false) if ManageError(ErrorList, readBatch) then return end Counter = not Counter elseif PriorityCount == 1 then LastRawId = NestingLib.NestPartInRawPart(GDB_ID.NULL, PartToBeMachined, materials[Material], ErrorList, false, false) if ManageError(ErrorList, readBatch) then return end end -- -- se Counter true faccio il nesting, se false completo grezzo -- -- verifico anche che non sia il primo giro in cui dovrei prima riempire i pannelli dei pezzi painted -- if Counter and not materials[Material].PartList[Index].Priority == 2 then -- LastRawId = NestPartInRawPart(LastRawId, PartList, materials[Material]) -- end end -- se il numero di gruppi delle priorita' e' dispari eseguo un altro nesting sui pezzi rimasti dal riempimento if materials[Material].PriorityList[1].Priority == 1 then PriorityCount = PriorityCount - 1 end if PriorityCount % 2 == 0 then -- annullo LastRaw perche' devo partire con un nuovo grezzo, altrimenti aggiungo pezzi sbagliati (riempimento gia' fatto!) LastRawId = GDB_ID.NULL LastRawId = NestingLib.NestPartInRawPart(LastRawId, PartToBeMachined, materials[Material], ErrorList, false, false) if ManageError(ErrorList, readBatch) then return end end -- calcolo lavorazioni, stime, ecc NestingLib.PostNestOp(materials[Material], ErrorList, false, readBatch.BatchId, 1) NestingLib.PostNestOp(materials[Material], ErrorList, false, readBatch.BatchId, 2) NestingLib.PostNestOp(materials[Material], ErrorList, false, readBatch.BatchId, 3) if ManageError(ErrorList, readBatch) then return end -- salvo il progetto di nesting local sProjectPath = NestingLib.VerifyPath("Nesting", readBatch.BatchId, nil) EgtSaveFile(sProjectPath .. "/" .. materials[Material].MatId .. ".nge") end end EgtOutText("End sheets nest") -- se debug if DebugCode then -- verifico di aver messo tutti i part su un grezzo local PartList = {} -- raccolgo tutti i part dai materiali in una lista for MaterialIndex = 1, #materials do if materials[MaterialIndex].SheetList then for SheetIndex = 1, #materials[MaterialIndex].SheetList do for PartIndex = 1, #materials[MaterialIndex].SheetList[SheetIndex].PartList do table.insert(PartList, tonumber(materials[MaterialIndex].SheetList[SheetIndex].PartList[PartIndex].PartId)) end end end end -- passo i part del readbatch for OrderIndex = 1, #readBatch.OrderList do for KitIndex = 1, #readBatch.OrderList[OrderIndex].KitList do for BPartIndex = 1, #readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList do local bFound = false for VPartIndex = #PartList, 1, -1 do if readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList[BPartIndex].PartId == PartList[VPartIndex] then if not bFound then bFound = true table.remove(PartList, VPartIndex) else table.insert(ErrorList, {ErrType = "E.12", Uid = "PartId = " .. readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList[BPartIndex].PartId, Description = "Part duplicated after nesting!"}) end end end if not bFound then table.insert(ErrorList, {ErrType = "E.12", Uid = "PartId = " .. readBatch.OrderList[OrderIndex].KitList[KitIndex].PartList[BPartIndex].PartId, Description = "Part lost after nesting!"}) end end end end -- verifico se sono rimasti elementi nella tabella kit if #PartList > 0 then table.insert(ErrorList, {ErrType = "E.12", Uid = "PartId = " .. PartList[1], Description = #PartList .. " part more than in batch request after nesting!"}) end end local MPCount = 0 -- ordino fogli da mettere sui bunk local SheetList = {} for Material = 1, #materials do if materials[Material].SheetList and #materials[Material].SheetList > 0 then for Sheet = 1, #materials[Material].SheetList do -- segno dimensioni materiale sul foglio materials[Material].SheetList[Sheet].L_mm = materials[Material].L_mm materials[Material].SheetList[Sheet].W_mm = materials[Material].W_mm materials[Material].SheetList[Sheet].T_mm = materials[Material].T_mm -- elimino priorita' 1 for PriorityIndex = 1, #materials[Material].SheetList[Sheet].PriorityList do if tonumber(materials[Material].SheetList[Sheet].PriorityList[PriorityIndex]) == 1 then table.remove(materials[Material].SheetList[Sheet].PriorityList, PriorityIndex) if #materials[Material].SheetList[Sheet].PriorityList == 0 then table.insert(materials[Material].SheetList[Sheet].PriorityList, "2") end end end -- verifico conto pezzi for Part = 1, #materials[Material].SheetList[Sheet].PartList do if materials[Material].SheetList[Sheet].PartList[Part].PartId == tostring(ProblematicItem) then local x = 2 end MPCount = MPCount + 1 end -- se lista ordinata non vuota if #SheetList > 0 then local bInserted = false -- scorro le priorita' for SearchIndex = 1, #SheetList do local bNotToBeInserted = false local MaxList = math.min(#SheetList[SearchIndex].PriorityList, #materials[Material].SheetList[Sheet].PriorityList) for PriorityIndex = 1, MaxList do if not bInserted and not bNotToBeInserted and ((tonumber(SheetList[SearchIndex].PriorityList[PriorityIndex]) > tonumber(materials[Material].SheetList[Sheet].PriorityList[PriorityIndex])) or (tonumber(SheetList[SearchIndex].PriorityList[PriorityIndex]) == tonumber(materials[Material].SheetList[Sheet].PriorityList[PriorityIndex]) and PriorityIndex == MaxList and #SheetList[SearchIndex].PriorityList > #materials[Material].SheetList[Sheet].PriorityList)) then table.insert(SheetList, SearchIndex, materials[Material].SheetList[Sheet]) bInserted = true elseif (tonumber(SheetList[SearchIndex].PriorityList[PriorityIndex]) < tonumber(materials[Material].SheetList[Sheet].PriorityList[PriorityIndex])) then bNotToBeInserted = true -- elseif ((SheetList[SearchIndex].PriorityList[PriorityIndex] == materials[Material].SheetList[Sheet].PriorityList[PriorityIndex]) -- and PriorityIndex == MaxList) then -- if #SheetList[SearchIndex].PriorityList > #materials[Material].SheetList[Sheet].PriorityList then -- table.insert(SheetList, PriorityIndex, materials[Material].SheetList[Sheet]) -- else -- table.insert(SheetList, PriorityIndex + 1, materials[Material].SheetList[Sheet]) -- end end end end if not bInserted then table.insert(SheetList, materials[Material].SheetList[Sheet]) end else table.insert(SheetList, materials[Material].SheetList[Sheet]) end end end end -- BUNK CREATI PER PRIORITA' E ALTEZZA MASSIMA -- creo bunk prendendo X fogli con priorita' piu' bassa local SheetXBunk = 10 local BunkList = {} local BunkIndex = 1 local CurrBunk = {BunkIndex = BunkIndex, SheetList = {}} table.insert(BunkList, CurrBunk) local CurrSheetOnBunk = 0 local CurrBunkPriority = 2 local CurrBunkThickness = 0 for Sheet = 1, #SheetList do -- if tonumber(SheetList[Sheet].PriorityList[1]) == 1 or tonumber(SheetList[Sheet].PriorityList[#SheetList[Sheet].PriorityList]) <= CurrBunkPriority + 1 then if tonumber(SheetList[Sheet].PriorityList[#SheetList[Sheet].PriorityList]) <= CurrBunkPriority + 1 and CurrBunkThickness + SheetList[Sheet].T_mm < Config.MaxBunkThickness then SheetList[Sheet].SheetIndex = CurrSheetOnBunk + 1 table.insert(CurrBunk.SheetList, SheetList[Sheet]) CurrSheetOnBunk = CurrSheetOnBunk + 1 CurrBunkThickness = CurrBunkThickness + SheetList[Sheet].T_mm else BunkIndex = BunkIndex + 1 SheetList[Sheet].SheetIndex = 1 CurrBunk = {BunkIndex = BunkIndex, SheetList = {}} table.insert(CurrBunk.SheetList, SheetList[Sheet]) table.insert(BunkList, CurrBunk) CurrSheetOnBunk = 1 local nSheetFirstPriority = tonumber(SheetList[Sheet].PriorityList[1]) for i = 2, #(SheetList[Sheet].PriorityList) do nSheetFirstPriority = min(nSheetFirstPriority, tonumber(SheetList[Sheet].PriorityList[i])) end CurrBunkPriority = EgtIf( nSheetFirstPriority == 2, nSheetFirstPriority, nSheetFirstPriority + 1) CurrBunkThickness = 0 end end -- BUNK CREATI CON SPESSORE MASSIMO -- -- creo bunk prendendo X fogli con priorita' piu' bassa -- local MaxBunkThickness = 500 -- local BunkList = {} -- local BunkIndex = 1 -- local CurrBunk = {BunkIndex = BunkIndex, SheetList = {}} -- table.insert(BunkList, CurrBunk) -- local CurrBunkThickness = 0 -- local CurrSheetOnBunk = 0 -- for Sheet = 1, #SheetList do -- if CurrBunkThickness < Config.MaxBunkThickness then -- SheetList[Sheet].SheetIndex = CurrSheetOnBunk + 1 -- table.insert(CurrBunk.SheetList, SheetList[Sheet]) -- CurrSheetOnBunk = CurrSheetOnBunk + 1 -- CurrBunkThickness = CurrBunkThickness + SheetList[Sheet].T_mm -- else -- BunkIndex = BunkIndex + 1 -- SheetList[Sheet].SheetIndex = 1 -- CurrBunk = {BunkIndex = BunkIndex, SheetList = {}} -- table.insert(CurrBunk.SheetList, SheetList[Sheet]) -- table.insert(BunkList, CurrBunk) -- CurrSheetOnBunk = 1 -- CurrBunkThickness = SheetList[Sheet].T_mm -- end -- end -- BUNK CREATI CON NUMERO MASSIMO DI FOGLI -- -- creo bunk prendendo X fogli con priorita' piu' bassa -- local SheetXBunk = 10 -- local BunkList = {} -- local BunkIndex = 1 -- local CurrBunk = {BunkIndex = BunkIndex, SheetList = {}} -- table.insert(BunkList, CurrBunk) -- local CurrSheetOnBunk = 0 -- for Sheet = 1, #SheetList do -- if CurrSheetOnBunk < SheetXBunk then -- SheetList[Sheet].SheetIndex = CurrSheetOnBunk + 1 -- table.insert(CurrBunk.SheetList, SheetList[Sheet]) -- CurrSheetOnBunk = CurrSheetOnBunk + 1 -- else -- BunkIndex = BunkIndex + 1 -- SheetList[Sheet].SheetIndex = 1 -- CurrBunk = {BunkIndex = BunkIndex, SheetList = {}} -- table.insert(CurrBunk.SheetList, SheetList[Sheet]) -- table.insert(BunkList, CurrBunk) -- CurrSheetOnBunk = 1 -- end -- end -- Ordino fogli sui singoli BUNK per dimensione for BunkIndex = 1, #BunkList do local OrderedSheets = {} -- divido i fogli in gruppi della stessa lunghezza for SheetIndex = 1, #BunkList[BunkIndex].SheetList do if #OrderedSheets > 0 then local bInserted = false for OrderedSheetIndex = 1, #OrderedSheets do if BunkList[BunkIndex].SheetList[SheetIndex].L_mm == OrderedSheets[OrderedSheetIndex].L_mm then bInserted = true table.insert(OrderedSheets[OrderedSheetIndex].SheetList, BunkList[BunkIndex].SheetList[SheetIndex]) end end if not bInserted then table.insert(OrderedSheets, {L_mm = BunkList[BunkIndex].SheetList[SheetIndex].L_mm, SheetList = {BunkList[BunkIndex].SheetList[SheetIndex]}}) end else table.insert(OrderedSheets, {L_mm = BunkList[BunkIndex].SheetList[SheetIndex].L_mm, SheetList = {BunkList[BunkIndex].SheetList[SheetIndex]}}) end end -- ordino i gruppi di pari lunghezza function compareLenght(a,b) return a.L_mm < b.L_mm end -- per ogni materiale riordino le priorita' -- for SheetIndex = 1, #OrderedSheets do table.sort(OrderedSheets, compareLenght) -- ordino i fogli per materiale all'interno dei gruppi function compareMaterial(a,b) return a.MatId < b.MatId end for OrderedIndex = 1, #OrderedSheets do table.sort(OrderedSheets[OrderedIndex].SheetList, compareMaterial) end -- end -- rimetto in lista tutti gli sheet come ordinati BunkList[BunkIndex].SheetList = {} local Index = 1 for OrderedSheetIndex = 1, #OrderedSheets do for SheetIndex = 1, #OrderedSheets[OrderedSheetIndex].SheetList do OrderedSheets[OrderedSheetIndex].SheetList[SheetIndex].SheetIndex = Index table.insert(BunkList[BunkIndex].SheetList, OrderedSheets[OrderedSheetIndex].SheetList[SheetIndex]) Index = Index + 1 end end end -- segno info con contenuto etichetta fogli -- local SHEETLABEL = "SheetLabel" -- for Material = 1, #materials do -- if EgtOpenFile(Config.sBasePath .. "/Nesting/" .. materials[Material].MatId .. ".nge") then -- local nMachGroupId = EgtGetFirstMachGroup() -- while nMachGroupId do -- local bOk = EgtSetCurrMachGroup(nMachGroupId) -- local sMachGroupName = EgtGetMachGroupName(nMachGroupId) -- for BunkIndex = 1, #BunkList do -- for SheetIndex = 1, #BunkList[BunkIndex].SheetList do -- if BunkList[BunkIndex].SheetList[SheetIndex].MatId == materials[Material].MatId and BunkList[BunkIndex].SheetList[SheetIndex].MachGroupName == sMachGroupName then -- local nRaw = EgtGetFirstRawPart() -- local nSheetLabel = EgtGetFirstNameInGroup(nRaw, SHEETLABEL) -- local bOk = EgtSetInfo(nSheetLabel, SHEETLABEL, BunkIndex .. "." .. SheetIndex) -- end -- end -- end -- nMachGroupId = EgtGetNextMachGroup(nMachGroupId) -- end -- EgtSaveFile() -- end -- end -- se debug if DebugCode then -- verifico di aver messo tutti gli sheet sui bunk local SheetList = {} -- raccolgo tutti gli sheet dai bunk in una lista for BunkIndex = 1, #BunkList do for SheetIndex = 1, #BunkList[BunkIndex].SheetList do table.insert(SheetList, BunkList[BunkIndex].SheetList[SheetIndex]) end end -- passo gli sheet dei material for MaterialIndex = 1, #materials do if materials[MaterialIndex].SheetList then for BSheetIndex = 1, #materials[MaterialIndex].SheetList do local bFound = false for VSheetIndex = 1, #SheetList do if materials[MaterialIndex].SheetList[BSheetIndex] == SheetList[VSheetIndex] then bFound = true table.remove(SheetList, VSheetIndex) end end if not bFound then table.insert(ErrorList, {ErrType = "E.12", Uid = "SheetId = " ..materials[MaterialIndex].MaterialId .." - " .. materials[MaterialIndex].SheetList[BSheetIndex].SheetIndex, Description = "Sheet lost after distribution on bunks!"}) end end end end -- verifico se sono rimasti elementi nella tabella kit if #SheetList > 0 then table.insert(ErrorList, {ErrType = "E.12", Uid = "SheetId = " .. SheetList[1].SheetIndex, Description = #PartList .. " sheet more than in materials after distribution on bunks!"}) end end local MPCount2 = 0 local TotThickness = 0 for CurrBunk = 1, #BunkList do for CurrSheet = 1, #BunkList[CurrBunk].SheetList do TotThickness = TotThickness + BunkList[CurrBunk].SheetList[CurrSheet].T_mm MPCount2 = MPCount2 + 1 end end -- verifica assenza pezzi tra ricevuti e messi sui fogli --local SVPartList = {} --for Sheet = 1, #materials[11].SheetList do -- for Part = 1, #materials[11].SheetList[Sheet].PartList do -- table.insert(SVPartList, materials[11].SheetList[Sheet].PartList[Part].PartId) -- end --end --table.sort(VPartList) --table.sort(SVPartList) --local ListCount = #VPartList --local List1 = VPartList --local List2 = SVPartList --local Only1 = {} --local Only2 = {} --if #SVPartList > #VPartList then -- ListCount = #SVPartList -- List1 = SVPartList -- List2 = VPartList --end --local Index1, Index2 = 1, 1 --while Index1 <= #List1 do -- if Index2 <= #List2 then -- if List1[Index1] > tonumber(List2[Index2]) then -- table.insert(Only2, List2[Index2]) -- Index2 = Index2 + 1 -- elseif List1[Index1] < tonumber(List2[Index2]) then -- table.insert(Only1, List2[Index2]) -- Index1 = Index1 + 1 -- Index2 = Index2 + 1 -- end -- else -- table.insert(Only1, List2[Index2]) -- Index1 = Index1 + 1 -- end --end -- creo batch di risposta local answ = {} answ.BatchId = readBatch.BatchId answ.EnvNum = readBatch.EnvNum answ.ProcType = readBatch.ProcType answ.MachineType = readBatch.MachineType answ.OrderType = readBatch.OrderType answ.ProcessNotes = "" -- sommo tempo totale di lavorazione e superficie materiale utilizzata local TotTime = 0 local SurfaceWork = 0 local SurfaceTotal = 0 local ChangeSheetTime = 100 for Material = 1, #materials do if materials[Material] and materials[Material].SheetList and #materials[Material].SheetList > 0 then for Sheet = 1, #materials[Material].SheetList do TotTime = TotTime + materials[Material].SheetList[Sheet].EstimatedWorktime + ChangeSheetTime SurfaceWork = SurfaceWork + materials[Material].SheetList[Sheet].SurfaceWork SurfaceTotal = SurfaceTotal + materials[Material].SheetList[Sheet].SurfaceTotal end end end answ.EstimatedWorktime = TotTime answ.SurfaceWork = SurfaceWork answ.SurfaceTotal = SurfaceTotal -- aggiungo i bunk alla risposta answ.BunkList = BunkList -- aggiungo carrelli con kit alla risposta eliminando gli ordini -- local StartCartIndex = 0 -- if readBatch.NumIndexStart then -- StartCartIndex = readBatch.NumIndexStart -- end for CartIndex = 1, #Carts do Carts[CartIndex].KitList = {} -- Carts[CartIndex].CartIndex = StartCartIndex + CartIndex - 1 for OrderIndex = 1, #Carts[CartIndex].OrderList do for KitIndex = 1, #Carts[CartIndex].OrderList[OrderIndex].KitList do table.insert(Carts[CartIndex].KitList, Carts[CartIndex].OrderList[OrderIndex].KitList[KitIndex]) end end end answ.CartList = Carts -- aggiungo bins alla risposta answ.BinList = Bins -- attacco lista errori e tempo di computazione answ.ErrorList = ErrorList if #ErrorList == 0 then answ.ProcessStatus = 3 else answ.ProcessStatus = 2 end answ.ProcessingRuntime = EgtStopCounter() / 1000 -- invio dati local bOk = RESTLib.set(Config.sPathBatch, answ) if bOk then print("OK") end EgtOutText("Nesting end") end -- -- funzione che esegue calcolo stima tempi function Estimate(readBatch) -- calcolo lavorazioni, stime, ecc local IsOffLine = false if readBatch.OrderType == 1 then IsOffLine = true end -- imposto macchina in uso NestingLib.ManageMachine(IsOffLine) EgtOutText("Estimate start") -- lista errori local ErrorList = {} -- conto tutto local OrderCount = #readBatch.OrderList local KitCount = 0 local PartCount = 0 local NoDXFCount = 0 local NoMaterialCount = 0 local NoMaterialCount2 = 0 for Order = 1, #readBatch.OrderList do KitCount = KitCount + #readBatch.OrderList[Order].KitList for Kit = 1, #readBatch.OrderList[Order].KitList do PartCount = PartCount + #readBatch.OrderList[Order].KitList[Kit].PartList end end -- recupero lista materiali local materials = RESTLib.get(Config.sPathMat) -- aggiungo liste pezzi for Material = 1, #materials do if not materials[Material].PartList then materials[Material].PartList = {} end end -- divido pezzi per materiale local CurrOrderIndex = 1 local CurrOrderCount = #readBatch.OrderList if Config.bDoubleMach then CurrOrderIndex = readBatch.CurrOrderIndex CurrOrderCount = readBatch.CurrOrderIndex end for Order = CurrOrderIndex, CurrOrderCount do OrderCount = OrderCount + 1 for Kit = 1, #readBatch.OrderList[Order].KitList do KitCount = KitCount + 1 for Part = 1, #readBatch.OrderList[Order].KitList[Kit].PartList do PartCount = PartCount + 1 local TempPart = readBatch.OrderList[Order].KitList[Kit].PartList[Part] -- leggo le proprietà dal dxf e le imposto local MatExtCode, PdfLink, Paint, OptParameters, ErrorType = UtilityLib.readDXF(TempPart.CadFilePath, TempPart.PartExtCode, true, readBatch.CreatePng) -- solo se trovo il materiale vado avanti per questo pezzo if ErrorType == 0 and MatExtCode then TempPart.MatExtCode = MatExtCode TempPart.OptParameters = OptParameters TempPart.OptParameters.PdfLink = PdfLink local PaintVal = "NO" if Paint then PaintVal = "YES" end TempPart.OptParameters.PaintFlag = PaintVal -- suddivido i pezzi per materiale for Material = 1, #materials do if TempPart.MatExtCode == materials[Material].MatExtCode then TempPart.MatId = materials[Material].MatId -- aggiungo il pezzo all'interno del materiale table.insert(materials[Material].PartList, TempPart) end end elseif ErrorType == 1 then table.insert(ErrorList, {ErrType = "E.1", Uid = "PartId = " .. TempPart.PartId, Description = "Can't find DXF file"}) EgtOutLog("Part skipped: " .. TempPart.PartId) elseif ErrorType == 2 then table.insert(ErrorList, {ErrType = "E.2", Uid = "PartId = " .. TempPart.PartId, Description = "Can't find material tag in DXF"}) EgtOutLog("Part skipped: " .. TempPart.PartId) else table.insert(ErrorList, {ErrType = "E.6", Uid = "PartId = " .. TempPart.PartId, Description = "Error in DXF reading"}) EgtOutLog("Part skipped: " .. TempPart.PartId) end end end end PartCount1 = 0 local MatIde = 10 -- local MatIndex = MatIde + 1 -- local MatCount = MatIndex local MatIndex = 1 local MatCount = #materials -- per ogni materiale creo un progetto local PARTID = "PartId" local PRIORITY = "Priority" local ROUGHER = {".375 ROUGHER","ROUGHER"} local DTMXPOS = "DATA MATRIX CODE POSITION" local MatSheetList = {} --for Material = 1, #materials do for Material = MatIndex, MatCount do -- se è il materiale nullo salto al prossimo if materials[Material].MatId ~= 0 and #materials[Material].PartList > 0 then EgtOutText("Material: " .. materials[Material].MatDesc) EgtNewFile() materials[Material].SheetList = {} local PartToBeMachined = {} for Part = 1, #materials[Material].PartList do table.insert(PartToBeMachined, materials[Material].PartList[Part]) end local IsValidation = false if readBatch.MaxTime == 1 then IsValidation = true end NestingLib.NestPartInRawPart(nil, PartToBeMachined, materials[Material], ErrorList, true, IsValidation) local bOk, answ = ManageError(ErrorList, readBatch) -- se doppia macchina if bOk then if Config.bDoubleMach then return answ else return end end NestingLib.PostNestOp(materials[Material], ErrorList, true, readBatch.BatchId) bOk, answ = ManageError(ErrorList, readBatch) -- se doppia macchina if bOk then if Config.bDoubleMach then return answ else return end end -- -- salvo il progetto di nesting -- EgtSaveFile(Config.sBasePath .. "/Estimate/" .. materials[Material].MatId .. ".nge") -- salvo il progetto di nesting local sProjectPath = NestingLib.VerifyPath("Estimate", readBatch.BatchId, nil) EgtSaveFile(sProjectPath .. "/" .. materials[Material].MatId .. ".nge") end end EgtOutText("End sheets estimate") -- creo batch di risposta local answ = {} answ.BatchId = readBatch.BatchId answ.EnvNum = readBatch.EnvNum answ.ProcType = readBatch.ProcType answ.MachineType = readBatch.MachineType answ.OrderType = readBatch.OrderType answ.ProcessNotes = "" -- sommo tempo totale di lavorazione local TotTime = 0 local ChangeSheetTime = 100 for Material = 1, #materials do if materials[Material] and materials[Material].SheetList and #materials[Material].SheetList > 0 then for Sheet = 1, #materials[Material].SheetList do TotTime = TotTime + materials[Material].SheetList[Sheet].EstimatedWorktime + ChangeSheetTime end end end answ.EstimatedWorktime = TotTime + (TotTime * 0.1) -- aggiungo 10% di sicurezza if readBatch.OrderType == 1 then answ.DrawingPath = NestingLib.VerifyPath("SVG", readBatch.BatchId, nil) .. "/" answ.CNCPath = NestingLib.VerifyPath("CNC", readBatch.BatchId, nil) .. "/" end -- recupero pezzi analizzati answ.PartList = {} for Material = MatIndex, MatCount do if materials[Material].PartList and #materials[Material].PartList > 0 then for Part = 1, #materials[Material].PartList do table.insert(answ.PartList, materials[Material].PartList[Part]) end end end -- attacco lista errori e tempo di computazione answ.ErrorList = ErrorList if #ErrorList == 0 then answ.ProcessStatus = 3 else answ.ProcessStatus = 2 end answ.ProcessingRuntime = EgtStopCounter() / 1000 -- se doppia macchina if Config.bDoubleMach then return answ end -- invio dati local bOk = RESTLib.set(Config.sPathBatch, answ) if bOk then print("OK") end EgtOutText("Estimate end") end -- -- funzione che esegue calcolo stima tempi function ExtendedEstimate(readBatch) -- creo batch di risposta local answ = {} answ.BatchId = readBatch.BatchId answ.EnvNum = readBatch.EnvNum answ.ProcType = readBatch.ProcType answ.MachineType = readBatch.MachineType answ.OrderType = readBatch.OrderType answ.ProcessNotes = "" -- lista errori local ErrorList = {} -- tempo totale stimato local TotTime = 0 answ.EstOrderList = {} answ.PartList = {} -- chiamo stima per ogni materiale for Order = 1, #readBatch.OrderList do readBatch.CurrOrderIndex = Order local estm = Estimate(readBatch) -- aggiungo pezzi a lista pezzi del risultato if #estm.ErrorList == 0 then for PartIndex = 1, #estm.PartList do table.insert(answ.PartList, estm.PartList[PartIndex]) end end -- accodo errori dell'ordine for ErrorIndex = 1, #estm.ErrorList do table.insert(ErrorList, estm.ErrorList[ErrorIndex]) end if ManageError(ErrorList, readBatch, true) then return end -- recupero lista materiali local materials = RESTLib.get(Config.sPathMat) for MaterialIndex = 1, #materials do materials[MaterialIndex].PriorityList = {} end local OrderList = {} local Carts = {} table.insert( OrderList, readBatch.OrderList[Order]) -- calcolo numero carrelli NestingLib.FilterPaintedParts(OrderList, materials, ErrorList) NestingLib.CreateCart(OrderList, Carts) -- imposto priorità sui pezzi in base ai carrelli e li divido per materiale e priorità NestingLib.SetPriorityProcessMaterial(Carts, materials, ErrorList) -- creo bin necessari local Bins = {} NestingLib.CreateBin(materials, Bins) -- riporto numero pezzi, carrelli e stima tempo taglio nell'ordine readBatch.OrderList[Order].NumCart = #Carts readBatch.OrderList[Order].NumBin = #Bins readBatch.OrderList[Order].NumPart = #estm.PartList readBatch.OrderList[Order].TotTime = estm.EstimatedWorktime TotTime = TotTime + estm.EstimatedWorktime -- aggiungo ordine a lista ordini del risultato table.insert(answ.EstOrderList, readBatch.OrderList[Order]) end -- correggo e riporto tempo totale di lavorazione answ.EstimatedWorktime = TotTime -- attacco lista errori e tempo di computazione answ.ErrorList = ErrorList if #ErrorList == 0 then answ.ProcessStatus = 3 else answ.ProcessStatus = 2 end answ.ProcessingRuntime = EgtStopCounter() / 1000 -- invio dati local bOk = RESTLib.set(Config.sPathBatch, answ) if bOk then print("OK") end EgtOutText("ExtendedEstimate end") end -- -- verifico che non ci siano istanze gia' in corso if not EgtCreateMutex('Global\\MainNKCLuaScript') then EgtOutLog( 'Impossible starting script! Script already in execution!') EgtOutBox( 'Script already running! Impossible running another instance at the same time!!', 'Error' , 'ERROR', 'OK') EgtCloseExe() end -- ciclo principale while true do EgtNewFile() if EgtProcessEvents( 1, 5) == 1 then break else -- leggo un batch local readBatch = RESTLib.get(Config.sPathBatch) if not readBatch or readBatch.BatchId == 0 then --or #readBatch == 0 then EgtPause(Config.CycleDelay) -- socket.sleep(0.5) -- EgtOutLog("Server connection error!") else EgtStartCounter() -- readBatch.OrderType = 1 -> Offline if readBatch.ProcType == 1 or readBatch.OrderType == 1 then Estimate(readBatch) elseif readBatch.ProcType == 3 then Config.bDoubleMach = true ExtendedEstimate(readBatch) else Nesting(readBatch) end end end end EgtReleaseMutex()