From 45522353830ac311c3f237f9cabf4e634ae1cfc2 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Mon, 29 Jun 2026 17:28:09 +0200 Subject: [PATCH] - in BeamExec modifiche per calcolare le alternative in base ai tagli di testa e coda finali scelti --- LuaLibs/BeamExec.lua | 157 ++++++++++++++++++++++++------------------- NestProcess.lua | 3 +- 2 files changed, 89 insertions(+), 71 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 646574c..d080d3c 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -822,7 +822,33 @@ local function AreDrillingsMirrored( Proc, ProcMirror, Part) end ------------------------------------------------------------------------------------------------------------- -local function GetFeatureInfoAndDependency( vProcSingleRot, Part, bIsFlipRot) +local function GetHeadTailInfoForNesting( HeadProc, TailProc, Part) + -- per nesting, si settano come info gli offset X degli estremi dei tagli + local HeadcutInfo = {} + local PtSortedHead = BeamLib.GetSortedVertices( HeadProc) + if PtSortedHead then + HeadcutInfo.OffsetX = {} + for i = 1, #PtSortedHead do + table.insert( HeadcutInfo.OffsetX, Part.b3Part:getMax():getX() - PtSortedHead[i]:getX()) + end + end + local TailcutInfo = {} + local PtSortedTail = BeamLib.GetSortedVertices( TailProc) + if PtSortedTail then + TailcutInfo.OffsetX = {} + for i = 1, #PtSortedTail do + table.insert( TailcutInfo.OffsetX, Part.b3Part:getMin():getX() - PtSortedTail[i]:getX()) + end + end + -- per nesting, si settano come info le normali delle facce di taglio + HeadcutInfo.vtN = HeadProc.Faces[1].vtN + TailcutInfo.vtN = TailProc.Faces[1].vtN + + return HeadcutInfo, TailcutInfo +end + +------------------------------------------------------------------------------------------------------------- +local function GetFeatureInfoAndDependency( vProcSingleRot, Part) -- gruppo per geometrie temporanee local idTempGroup = BeamLib.GetTempGroup() @@ -994,28 +1020,8 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part, bIsFlipRot) TailProc.Topology.sName = 'TailCut' HeadProc.AvailableStrategies = GetStrategies( HeadProc, Part.sAISetupConfig) TailProc.AvailableStrategies = GetStrategies( TailProc, Part.sAISetupConfig) - -- per nesting, si settano come info gli offset X degli estremi dei tagli - local HeadcutInfo = {} - local PtSortedHead = BeamLib.GetSortedVertices( HeadProc) - if PtSortedHead then - HeadcutInfo.OffsetX = {} - for i = 1, #PtSortedHead do - table.insert( HeadcutInfo.OffsetX, Part.b3Part:getMax():getX() - PtSortedHead[i]:getX()) - end - end - local TailcutInfo = {} - local PtSortedTail = BeamLib.GetSortedVertices( TailProc) - if PtSortedTail then - TailcutInfo.OffsetX = {} - for i = 1, #PtSortedTail do - table.insert( TailcutInfo.OffsetX, Part.b3Part:getMin():getX() - PtSortedTail[i]:getX()) - end - end - -- per nesting, si settano come info le normali delle facce di taglio - HeadcutInfo.vtN = HeadProc.Faces[1].vtN - TailcutInfo.vtN = TailProc.Faces[1].vtN - return vProcSingleRot, HeadcutInfo, TailcutInfo + return vProcSingleRot end ------------------------------------------------------------------------------------------------------------- @@ -1480,8 +1486,6 @@ function BeamExec.GetProcessings( PARTS, bIsFlipRot) -- se è prerotazione, oltre al ciclo normale, si devono verificare anche invertiti local bCalcInverted = bIsFlipRot and PARTS[nPart].GeneralParameters.GEN_bAllowPieceInversion local nCycles = EgtIf( bCalcInverted, 2, 1) - PARTS[nPart].HeadcutInfo = {} - PARTS[nPart].TailcutInfo = {} -- per ogni inversione for nInvertIndex = 1, nCycles do -- per ogni rotazione @@ -1497,23 +1501,11 @@ function BeamExec.GetProcessings( PARTS, bIsFlipRot) -- recupero informazioni ausiliarie feature e dipendenze tra feature stesse -- TODO le dipendenze cambiano in base alla rotazione del pezzo? probabilmente no - vProcRot[nIndex], HeadcutInfo, TailcutInfo = GetFeatureInfoAndDependency( vProcRot[nIndex], PARTS[nPart], bIsFlipRot) + vProcRot[nIndex] = GetFeatureInfoAndDependency( vProcRot[nIndex], PARTS[nPart]) else -- inserisco una tabella vuota table.insert( vProcRot, {}) end - if HeadcutInfo then - PARTS[nPart].HeadcutInfo[nIndex] = { - OffsetX = HeadcutInfo.OffsetX, - vtN = HeadcutInfo.vtN - } - end - if TailcutInfo then - PARTS[nPart].TailcutInfo[nIndex] = { - OffsetX = TailcutInfo.OffsetX, - vtN = TailcutInfo.vtN - } - end -- rotazione pezzo di 90° per volta BeamLib.RotateRawPart( PARTS[nPart], 1) -- aggiorno info pezzo @@ -1742,7 +1734,7 @@ local function GetCombinationListFromMatrix( ProcessingsOnPart, PartInfo, bRePro -- tagli testa e coda vengono aggiunti sempre alla fine local nOffsetIndex = EgtIf( SingleCombination.bPartInCombiIsInverted, 4, 0) for nProc = 1, #ProcessingsOnPart.Rotation[1+nOffsetIndex] do - -- Si controlla sempre la rotazione 1 perchè la dipendenza di una feature da un'altra non dipende dalla rotazione + -- Si controlla sempre la rotazione 1 perchè la dipendenza di una feature da un'altra non dipende dalla rotazione (ma dall'inversione sì!) -- se feature disattivata perchè eseguita da master a lei associata dichiaro comunque eseguita local ProcOnFirstRotation = ProcessingsOnPart.Rotation[1+nOffsetIndex][nProc] if ProcOnFirstRotation.nFlg == 0 and ProcOnFirstRotation.nIndexMasterProc then @@ -1982,30 +1974,34 @@ function BeamExec.ProcessMachinings( PARTS, bIsFlipRot) if nRotSplitCut > 4 then nRotSplitCut = nRotSplitCut - 4 end + + local HeadCut = PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc] + local TailCut = PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc] + -- setto nella Proc l'indice rotazione nella quale deve essere lavorata - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].nIndexRotation = nRotHeadCut - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].nIndexRotation = nRotSplitCut + HeadCut.nIndexRotation = nRotHeadCut + TailCut.nIndexRotation = nRotSplitCut -- si imposta flag rotazione per taglio di testa if MACHININGS.Info.nHeadCutRotation == 2 then - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bSide = true + HeadCut.bSide = true elseif MACHININGS.Info.nHeadCutRotation == 3 then - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bDown = true + HeadCut.bDown = true else - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bStd = true + HeadCut.bStd = true end -- si imposta flag rotazione per taglio di coda if MACHININGS.Info.nSplitCutRotation == 2 then - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bSide = true + TailCut.bSide = true elseif MACHININGS.Info.nSplitCutRotation == 3 then - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bDown = true + TailCut.bDown = true else - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bStd = true + TailCut.bStd = true end local vProcHeadTail = {} - table.insert( vProcHeadTail, PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc]) - table.insert( vProcHeadTail, PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc]) + table.insert( vProcHeadTail, HeadCut) + table.insert( vProcHeadTail, TailCut) MACHININGS = CalculateMachinings( vProcHeadTail, PARTS[nPart], MatrixResult.nInitialPosition) @@ -2385,42 +2381,63 @@ function BeamExec.ProcessAlternatives( PARTS) if nRotSplitCut > 4 then nRotSplitCut = nRotSplitCut - 4 end + + local HeadCut = PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc] + local TailCut = PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc] + -- setto nella Proc l'indice rotazione nella quale deve essere lavorata - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].nIndexRotation = nRotHeadCut - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].nIndexRotation = nRotSplitCut + HeadCut.nIndexRotation = nRotHeadCut + TailCut.nIndexRotation = nRotSplitCut -- si imposta flag rotazione per taglio di testa if MACHININGS.Info.nHeadCutRotation == 2 then - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bDown = nil - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bSide = true - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bStd = nil + HeadCut.bDown = nil + HeadCut.bSide = true + HeadCut.bStd = nil elseif MACHININGS.Info.nHeadCutRotation == 3 then - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bDown = true - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bSide = nil - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bStd = nil + HeadCut.bDown = true + HeadCut.bSide = nil + HeadCut.bStd = nil else - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bDown = nil - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bSide = nil - PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc].bStd = true + HeadCut.bDown = nil + HeadCut.bSide = nil + HeadCut.bStd = true end -- si imposta flag rotazione per taglio di coda if MACHININGS.Info.nSplitCutRotation == 2 then - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bDown = nil - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bSide = true - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bStd = nil + TailCut.bDown = nil + TailCut.bSide = true + TailCut.bStd = nil elseif MACHININGS.Info.nSplitCutRotation == 3 then - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bDown = true - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bSide = nil - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bStd = nil + TailCut.bDown = true + TailCut.bSide = nil + TailCut.bStd = nil else - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bDown = nil - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bSide = nil - PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc].bStd = true + TailCut.bDown = nil + TailCut.bSide = nil + TailCut.bStd = true end local vProcHeadTail = {} - table.insert( vProcHeadTail, PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc]) - table.insert( vProcHeadTail, PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc]) + table.insert( vProcHeadTail, HeadCut) + table.insert( vProcHeadTail, TailCut) + + -- aggiornamento info testa/coda per Nesting + local HeadcutInfo, TailcutInfo = GetHeadTailInfoForNesting( HeadCut, TailCut, PARTS[nPart]) + PARTS[nPart].HeadcutInfo = {} + PARTS[nPart].TailcutInfo = {} + if HeadcutInfo then + PARTS[nPart].HeadcutInfo[nRotHeadCut+nOffsetIndex] = { + OffsetX = HeadcutInfo.OffsetX, + vtN = HeadcutInfo.vtN + } + end + if TailcutInfo then + PARTS[nPart].TailcutInfo[nRotSplitCut+nOffsetIndex] = { + OffsetX = TailcutInfo.OffsetX, + vtN = TailcutInfo.vtN + } + end MACHININGS = CalculateMachinings( vProcHeadTail, PARTS[nPart], MatrixResult.nInitialPosition) diff --git a/NestProcess.lua b/NestProcess.lua index d07e0e2..84f4b06 100644 --- a/NestProcess.lua +++ b/NestProcess.lua @@ -223,7 +223,8 @@ function PartTemplates:AddPart( id) end -- info eventuali rotazioni / inversioni custom e forzature manuali - local bIsManualFlipRot = ( ( EgtGetInfo( id, 'MANUALROT', 'i') or 0) == 1) or ( ( EgtGetInfo( id, 'MANUALFLIP', 'i') or 0) == 1) + -- TODO ignorare gli stati calcolati porta a problemi, valutare se eliminare del tutto la dipendenza da bIsManualFlipRot + --local bIsManualFlipRot = ( ( EgtGetInfo( id, 'MANUALROT', 'i') or 0) == 1) or ( ( EgtGetInfo( id, 'MANUALFLIP', 'i') or 0) == 1) if not bIsManualFlipRot then