From f4baf8a43b40369c32b288eab74fce3f88683e81 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Tue, 10 Oct 2023 18:53:12 +0200 Subject: [PATCH] - gestione pezzi grandi quasi quanto il foglio --- Config.lua | 4 +- Main.lua | 5 ++- NestingLib.lua | 99 ++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 85 insertions(+), 23 deletions(-) diff --git a/Config.lua b/Config.lua index c7f8549..d045c89 100644 --- a/Config.lua +++ b/Config.lua @@ -161,7 +161,7 @@ Config.Kerf = {{MatId = 1, MatExtCode = 6120, Kerf = 8}, {MatId = 11, MatExtCode = 6423, Kerf = 20}, {MatId = 12, MatExtCode = 112268, Kerf = 20}, {MatId = 13, MatExtCode = 119169, Kerf = 20}, - {MatId = 14, MatExtCode = 121214, Kerf = 20}, + {MatId = 14, MatExtCode = 121214, Kerf = 10}, {MatId = 15, MatExtCode = 111625, Kerf = 20}, {MatId = 16, MatExtCode = 6127, Kerf = 20}, {MatId = 17, MatExtCode = 6044, Kerf = 20}, @@ -174,7 +174,7 @@ Config.Kerf = {{MatId = 1, MatExtCode = 6120, Kerf = 8}, {MatId = 26, MatExtCode = 127662, Kerf = 20}, {MatId = 27, MatExtCode = 127663, Kerf = 20}, {MatId = 28, MatExtCode = 127664, Kerf = 20}, - {MatId = 29, MatExtCode = 127665, Kerf = 20}, + {MatId = 29, MatExtCode = 127665, Kerf = 10}, } Config.KitXModel = {{Model = '65w981', KitQty = 6}, diff --git a/Main.lua b/Main.lua index c7e4d4c..bcd2e96 100644 --- a/Main.lua +++ b/Main.lua @@ -19,7 +19,7 @@ package.cpath = package.cpath .. ";/EgtDevTest/LUAREST/32/?.lua" require( 'EgtBase') _ENV = EgtProtectGlobal() -EgtEnableDebug( false) +EgtEnableDebug( true) -- Imposto direttorio libreria specializzata per Nesting local sBaseDir = EgtGetSourceDir() @@ -279,7 +279,7 @@ function Nesting(readBatch) local MatSheetList = {} --for Material = 1, #materials do for Material = MatIndex, MatCount do - --for Material = 2, 2 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 @@ -388,6 +388,7 @@ function Nesting(readBatch) -- 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 diff --git a/NestingLib.lua b/NestingLib.lua index b53697a..520b716 100644 --- a/NestingLib.lua +++ b/NestingLib.lua @@ -131,7 +131,7 @@ function NestingLib.FilterPaintedParts(OrderList, materials, ErrorList) end -- ordino per modelli kit - function compareOrderExtCode(a,b) + local function compareOrderExtCode(a,b) return a.OrderCod < b.OrderCod end table.sort(OrderList, compareOrderExtCode) @@ -537,8 +537,12 @@ local SKELETONPART = "SKELETON" local CUTOPT = "CUTOPT" -- funzione legge il dxf ed aggiunge il pezzo al nesting local function AddPartListToNesting(PartList, ErrorList, Material) + local BigPartsQty = 0 local LastId = GDB_ID.ROOT for Part = 1, #PartList do + if PartList[Part].PartExtCode == '128057' then + local f = 3 + end -- tipo di rotazione del pezzo consentita : 0 -> rotazione libera, 1 -> rotazione solo di 180°, 2 -> nessuna rotazione local RotationType = 0 -- verifico se gia' presente per importazione precedente @@ -602,7 +606,7 @@ local function AddPartListToNesting(PartList, ErrorList, Material) end -- se entro la tolleranza if -OutlineDepth >= (Material.T_mm - Config.ThicknessTolerance) and -OutlineDepth <= (Material.T_mm + Config.ThicknessTolerance) then - EgtModifyCurveThickness(OutlineId, -Material.T_mm) + EgtModifyCurveThickness(OutlineId, - Material.T_mm) end -- se il percorso non è chiuso if not EgtCurveIsClosed(OutlineId) then @@ -710,6 +714,10 @@ local function AddPartListToNesting(PartList, ErrorList, Material) RotationType = 1 end EgtSetName(nMaxId, OUTLINE) + -- verifico se e' grande quasi come il foglio + if OutlineBox:getDimX() > Material.L_mm - 51 or OutlineBox:getDimY() > Material.W_mm - 26 then + BigPartsQty = BigPartsQty + 1 + end -- copio outline in un layer dedicato local OutlineLayer = EgtGroup(PartId1) EgtSetName(OutlineLayer, OUTLINE) @@ -886,6 +894,8 @@ local function AddPartListToNesting(PartList, ErrorList, Material) end EgtAutoNestAddToolOutlineToPart( PartId1, nSkeletonRegionId) end + --EgtSaveFile("c:\\Temp\\TestSauderBig.nge") + return BigPartsQty end -- @@ -897,6 +907,9 @@ local function SetMachineByIndex(MachId) elseif MachId == 2 then sCurrMachName = "Multiax-NE_Nest02" EgtSetCurrMachine(sCurrMachName) + elseif MachId == 3 then + sCurrMachName = "Multiax-NE_Nest03" + EgtSetCurrMachine(sCurrMachName) end end -- @@ -915,6 +928,7 @@ local function CreateMachSheets(LastMachGroupId, SheetPartId, Material, PartList local Sheet = {PartList = {}} local bFirstSheet = true local nMach2SheetId = FirstMachIndex + local nMach3SheetId = FirstMachIndex for i = 0, 999 do local nType, nId, nFlag, dX, dY, dAngRot = EgtAutoNestGetOneResult( i) if not nType then break end @@ -932,6 +946,9 @@ local function CreateMachSheets(LastMachGroupId, SheetPartId, Material, PartList if MachId == 2 then nRawId = EgtGetInfo(nRawId, 'LastRaw2') EgtSetCurrMachGroup(EgtGetParent(EgtGetParent(nRawId))) + elseif MachId == 3 then + nRawId = EgtGetInfo(nRawId, 'LastRaw3') + EgtSetCurrMachGroup(EgtGetParent(EgtGetParent(nRawId))) end -- imposto foglio Sheet = Material.SheetList[#Material.SheetList] @@ -947,6 +964,10 @@ local function CreateMachSheets(LastMachGroupId, SheetPartId, Material, PartList --MachGroupName = "Sheet" .. nRaw1Id MachGroupName = EgtGetMachGroupNewName("M2_Sheet") MachGroupName = "M2Sheet" .. nMach2SheetId + elseif MachId == 3 then + nMach3SheetId = nMach3SheetId + 1 + MachGroupName = EgtGetMachGroupNewName("M3_Sheet") + MachGroupName = "M3Sheet" .. nMach3SheetId else MachGroupName = "Sheet" .. #Material.SheetList + 1 --SheetCounter end @@ -956,10 +977,14 @@ local function CreateMachSheets(LastMachGroupId, SheetPartId, Material, PartList -- end local bOk = EgtAddMachGroup(MachGroupName, sCurrMachName) -- se macchina 2 aggiungo info e riferimento a foglio della macchina 1 - if MachId ==2 then + if MachId == 2 then EgtSetInfo(EgtGetCurrMachGroup(), 'MachId', MachId) local nOrigSheetId = EgtGetMachGroupId("Sheet" .. nMach2SheetId) EgtSetInfo(EgtGetCurrMachGroup(), 'OrigSheetId', nOrigSheetId) + elseif MachId == 3 then + EgtSetInfo(EgtGetCurrMachGroup(), 'MachId', MachId) + local nOrigSheetId = EgtGetMachGroupId("Sheet" .. nMach3SheetId) + EgtSetInfo(EgtGetCurrMachGroup(), 'OrigSheetId', nOrigSheetId) end -- imposto tavola local vtOffs = UtilityLib.SetupMachineTable(IsOffline) @@ -983,7 +1008,7 @@ local function CreateMachSheets(LastMachGroupId, SheetPartId, Material, PartList --EgtOutLog( string.format( ' Part %d pos=%f,%f rot=%f flip=%d', nId, dX, dY, dAngRot, nFlag)) -- se ho un grezzo valido metto i pezzi local PartId = nId - if MachId ~= 2 then + if MachId ~= 2 and MachId ~= 3 then if nFlag ~= 0 then EgtMirror( PartId, ORIG(), Y_AX(), GDB_RT.GLOB) end @@ -1035,7 +1060,8 @@ function NestingLib.NestPartInRawPart(LastRaw, PartList, Material, ErrorList, Is EgtResetCurrMachGroup() -- aggiungo tutti i pezzi al nesting - AddPartListToNesting(PartList, ErrorList, Material) + local BigPartsQty = 0 + BigPartsQty = AddPartListToNesting(PartList, ErrorList, Material) or 0 -- ripristino MachGroup EgtSetCurrMachGroup(nOldMachGroup) @@ -1056,7 +1082,20 @@ function NestingLib.NestPartInRawPart(LastRaw, PartList, Material, ErrorList, Is dKerf = Config.Kerf[Index].Kerf end end - + + -- se ci sono pezzi grandi +-- if BigPartsQty > 0 then +-- -- creo un ugual numero di fogli senza etichetta +-- local BigSheetPartId = EgtGroup(GDB_ID.ROOT) +-- EgtSetName(BigSheetPartId, "Sheet") +-- local BigSheetLayerId = EgtGroup(BigSheetPartId) +-- EgtSetName(BigSheetLayerId, OUTLINE) +-- local BigSheetOutlineId = EgtRectangle2P(BigSheetLayerId, Point3d(0,0,0), Point3d(Material.L_mm, Material.W_mm, 0), GDB_RT.GLOB) +-- EgtModifyCurveThickness(BigSheetOutlineId, -Material.T_mm) +-- EgtSetName(BigSheetOutlineId, OUTLINE) +-- EgtAutoNestAddSheet( BigSheetPartId, BigSheetOutlineId, dKerf, 0, BigPartsQty) -- EgtAutoNestAddSheet( SheetId, OutlineId, dKerf, nPriority, nCount) +-- end + -- verifico se ultimo grezzo non nullo local LastMachGroupId = nil if LastRaw and LastRaw ~= GDB_ID.NULL then @@ -1086,6 +1125,18 @@ function NestingLib.NestPartInRawPart(LastRaw, PartList, Material, ErrorList, Is -- la aggiungo come difetto EgtAutoNestAddDefectToSheet(SheetPartId, nSheetLabel) -- EgtAutoNestAddDefectToSheet( SheetId, DefectId) else + -- se ci sono pezzi grandi + if BigPartsQty > 0 then + -- -- creo un ugual numero di fogli senza etichetta + -- local BigSheetPartId = EgtGroup(GDB_ID.ROOT) + -- EgtSetName(BigSheetPartId, "Sheet") + -- local BigSheetLayerId = EgtGroup(BigSheetPartId) + -- EgtSetName(BigSheetLayerId, OUTLINE) + -- local BigSheetOutlineId = EgtRectangle2P(BigSheetLayerId, Point3d(0,0,0), Point3d(Material.L_mm, Material.W_mm, 0), GDB_RT.GLOB) + -- EgtModifyCurveThickness(BigSheetOutlineId, -Material.T_mm) + -- EgtSetName(BigSheetOutlineId, OUTLINE) + EgtAutoNestAddSheet( SheetPartId, SheetOutlineId, dKerf, 0, BigPartsQty) -- EgtAutoNestAddSheet( SheetId, OutlineId, dKerf, nPriority, nCount) + end -- creo etichetta dello sheet local dLabelW = 50 local dLabelH = 25 @@ -1155,15 +1206,18 @@ function NestingLib.NestPartInRawPart(LastRaw, PartList, Material, ErrorList, Is if not IsOffline and not IsEstimate and not IsValidation then LastRaw2 = CreateMachSheets(LastMachGroupId, SheetPartId, Material, PartList, 2, LastRaw, FirstMachIndex) EgtSetInfo(LastRaw, 'LastRaw2', LastRaw2) + LastRaw3 = CreateMachSheets(LastMachGroupId, SheetPartId, Material, PartList, 3, LastRaw, FirstMachIndex) + EgtSetInfo(LastRaw, 'LastRaw3', LastRaw3) end -- se impostata seconda macchina, reimposto la prima local sMachName = EgtGetCurrMachineName() - if sMachName == 'Multiax-NE_Nest02' then + if sMachName == 'Multiax-NE_Nest02' or sMachName == 'Multiax-NE_Nest03' then SetMachineByIndex(1) end else table.insert(ErrorList, {ErrType = "E.10", Uid = "Generic", Description = "Error in nesting function!"}) end + --EgtSaveFile("c://Temp//TestSauderBigParts.nge") -- ritorno l'ultimo grezzo utilizzato return LastRaw end @@ -1318,7 +1372,7 @@ function NestingLib.VerifyPath(Folder, BatchId, Material, MachId) end end -- scelgo nome cartella macchina - if MachId == 0 or MachId == 1 or MachId == 2 then + if MachId == 0 or MachId == 1 or MachId == 2 or MachId == 3 then local MachDirName = '' if MachId == 0 then MachDirName = '##REPLACEME##' @@ -1326,6 +1380,8 @@ function NestingLib.VerifyPath(Folder, BatchId, Material, MachId) MachDirName = 'NE01' elseif MachId == 2 then MachDirName = 'NE02' + elseif MachId == 3 then + MachDirName = 'NE03' end CurrPath = CurrPath .. "/".. MachDirName if not UtilityLib.FolderExists(CurrPath) then @@ -1348,13 +1404,13 @@ function NestingLib.PostNestOp(Material, ErrorList, IsEstimate, BatchId, MachId) local PartsPriority = {} local CurrMachGroupId = EgtGetMachGroupId(Material.SheetList[Sheet].MachGroupName) -- se seconda macchina, imposto gruppo di lavorazione copia - if MachId == 2 then + if MachId == 2 or MachId == 3 then -- recupero id grezzo originale local nRawPartId = EgtGetFirstRawPart() -- cerco gruppo copia con id grezzo originale local nMachGroupId = EgtGetFirstMachGroup() while nMachGroupId do - if EgtGetInfo(nMachGroupId, 'OrigSheetId', 'i') == CurrMachGroupId and EgtGetInfo(nMachGroupId, 'MachId', 'i') == 2 then + if EgtGetInfo(nMachGroupId, 'OrigSheetId', 'i') == CurrMachGroupId and EgtGetInfo(nMachGroupId, 'MachId', 'i') == MachId then EgtSetCurrMachGroup(nMachGroupId) end nMachGroupId = EgtGetNextMachGroup(nMachGroupId) @@ -1388,7 +1444,7 @@ function NestingLib.PostNestOp(Material, ErrorList, IsEstimate, BatchId, MachId) else PartsArea = CreateMachByOrderedType(Material, CurrRawPart, PartsBBox, nSkeletonLayerId, PartsPriority, ErrorList) end - if MachId ~= 2 then + if MachId ~= 2 and MachId ~= 3 then -- imposto area totale dei pezzi Material.SheetList[Sheet].SurfaceWork = PartsArea -- calcolo area esterna @@ -1599,7 +1655,7 @@ function NestingLib.PostNestOp(Material, ErrorList, IsEstimate, BatchId, MachId) EgtApplyAllMachinings() -- aggiorno lavorazione un'altra volta per migliorare posizioni eventuali tab EgtApplyAllMachinings() - if MachId ~= 2 then + if MachId ~= 2 and MachId ~= 3 then -- ricavo stime local CurrEstimatePath = NestingLib.VerifyPath("Estimate", BatchId, Material) if not UtilityLib.FolderExists(CurrEstimatePath) then @@ -1632,7 +1688,7 @@ function NestingLib.PostNestOp(Material, ErrorList, IsEstimate, BatchId, MachId) else CurrCNCPath = CurrCNCPath .. "/" .. Material.SheetList[Sheet].MachGroupName .. ".cnc" end - if MachId == 2 then + if MachId == 2 or MachId == 3 then Material.SheetList[Sheet].MachiningProgram = DBCurrCNCPath .. "/" .. Material.SheetList[Sheet].MachGroupName .. ".cnc" else Material.SheetList[Sheet].MachiningProgram = CurrCNCPath @@ -1651,7 +1707,7 @@ function NestingLib.PostNestOp(Material, ErrorList, IsEstimate, BatchId, MachId) EgtCreateDirectory(CurrPrintPath) end CurrPrintPath = CurrPrintPath .. "/" .. Material.SheetList[Sheet].MachGroupName .. ".cnc" - if MachId == 2 then + if MachId == 2 or MachId == 3 then Material.SheetList[Sheet].PrintProgram = DBCurrPrintPath .. "/" .. Material.SheetList[Sheet].MachGroupName .. ".cnc" else Material.SheetList[Sheet].PrintProgram = CurrPrintPath @@ -1659,7 +1715,7 @@ function NestingLib.PostNestOp(Material, ErrorList, IsEstimate, BatchId, MachId) bOk = EgtCopyFile(CurrPrintCNCPath, CurrPrintPath) bOk = EgtEraseFile(CurrPrintCNCPath) end - if MachId ~= 2 then + if MachId ~= 2 and MachId ~= 3 then -- salvo svg del grezzo local CurrSVGPath = NestingLib.VerifyPath("SVG", BatchId, Material) if not UtilityLib.FolderExists(CurrSVGPath) then @@ -1747,10 +1803,12 @@ end end -- scrittura delle linee modificate local fh2 = io.open( LabelSVGPath, 'w') - for i = 1, #Lines do - fh2:write( Lines[i] .. '\n') + if fh2 then + for i = 1, #Lines do + fh2:write( Lines[i] .. '\n') + end + fh2:close() end - fh2:close() -- fine end @@ -1841,7 +1899,7 @@ function CreateMachByType(Material, CurrRawPart, PartsBBox, nSkeletonLayerId, Pa EgtSetName(CutPartsArea, PARTCUTSUM) else if not nPartSurfId then - x = 2 + local x = 2 end EgtSurfFrAdd(CutPartsArea, nPartSurfId) end @@ -2433,6 +2491,7 @@ function CalcPartMachinings(Material, CurrPart, bInternalPart, LastMch, nMachTyp EgtSetMachiningParam(MCH_MP.OFFSR, dRadial) EgtSetMachiningParam(MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) -- applico la lavorazione + local bValidOutlineMach = false if EgtApplyMachining() then bValidOutlineMach = true InitInTSP(NewMachId, InternalOutlineList, 0) @@ -2479,6 +2538,7 @@ function CalcPartMachinings(Material, CurrPart, bInternalPart, LastMch, nMachTyp EgtSetMachiningParam(MCH_MP.OFFSR, dRadial) EgtSetMachiningParam(MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT) -- applico la lavorazione + local bValidOutlineMach = false if EgtApplyMachining() then bValidOutlineMach = true InitInTSP(NewMachId, InternalOutlineList, 0) @@ -2526,6 +2586,7 @@ function CalcPartMachinings(Material, CurrPart, bInternalPart, LastMch, nMachTyp EgtSetMachiningParam(MCH_MP.OFFSR, dRadial) EgtSetMachiningParam(MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) -- applico la lavorazione + local bValidOutlineMach = false if EgtApplyMachining() then bValidOutlineMach = true InitInTSP(NewMachId, InternalOutlineList, 0)