From 3ba456f72f6bfad9a99bc328c4fc2fb8d1f0e5ce Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 19 May 2026 12:47:21 +0200 Subject: [PATCH] - in BeamLib e correlate modificata AddPhaseWithRawParts per funzionare con overlap dei pezzi per nesting obliquo --- LuaLibs/BeamExec.lua | 26 +++++++++++++------------- LuaLibs/BeamLib.lua | 21 +++++++++++++++++---- LuaLibs/MachiningLib.lua | 4 ++-- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 519c76e..55a4ce2 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1824,7 +1824,7 @@ function BeamExec.ProcessMachinings( PARTS, bIsFlipRot) nPhase = nPhase} table.insert( DB_MACH_APPLIED, MachExtraInfo) else - BeamLib.AddPhaseWithRawParts( PARTS[nPart].idRaw, BeamData.ptOriXR, BeamData.dPosXR, 0) + BeamLib.AddPhaseWithRawParts( PARTS, nPart, BeamData.ptOriXR, BeamData.dPosXR, 0) end -- si sposta il pezzo nella posizione originale, di quando è stata fatta la collect. In questo modo tutti i dati calcolati nella collect restano validi. -- Altrimenti bisognava ricalcolare tutto, aumentando tempo di calcolo. @@ -1982,7 +1982,7 @@ function BeamExec.ProcessMachinings( PARTS, bIsFlipRot) BeamLib.RotateRawPart( PARTS[nPart], nRotation - nCurrPosition) nCurrPosition = nRotation EgtSetInfo( idDisp, 'ROT', -2) - bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'DOWN') + bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS, PARTS[nPart], 'DOWN') bSplitAlreadyExecuted = bSplitAlreadyExecuted or bSplitExecutedOnRot bProcess = bProcess or bTryToReProcess end @@ -1991,7 +1991,7 @@ function BeamExec.ProcessMachinings( PARTS, bIsFlipRot) if MatrixResult.bSomeFeatureSide then -- se ci sono state lavorazioni in rotazione precedente devo creare altra fase. Altrimenti già creata da prima if MatrixResult.bSomeFeatureDown then - BeamLib.AddPhaseWithRawParts( PARTS[nPart].idRaw, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) + BeamLib.AddPhaseWithRawParts( PARTS, nPart, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) nPhase = EgtGetCurrPhase() idDisp = EgtGetPhaseDisposition( nPhase) EgtSetInfo( idDisp, 'ORD', nOrd) @@ -2010,14 +2010,14 @@ function BeamExec.ProcessMachinings( PARTS, bIsFlipRot) BeamLib.RotateRawPart( PARTS[nPart], nRotation - nCurrPosition) nCurrPosition = nRotation EgtSetInfo( idDisp, 'ROT', -1) - bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'SIDE') + bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS, PARTS[nPart], 'SIDE') bSplitAlreadyExecuted = bSplitAlreadyExecuted or bSplitExecutedOnRot bProcess = bProcess or bTryToReProcess end -- se ci sono state lavorazioni in rotazione precedente devo creare altra fase. Altrimenti già creata da prima if MatrixResult.bSomeFeatureDown or MatrixResult.bSomeFeatureSide then - BeamLib.AddPhaseWithRawParts( PARTS[nPart].idRaw, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) + BeamLib.AddPhaseWithRawParts( PARTS, nPart, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) nPhase = EgtGetCurrPhase() idDisp = EgtGetPhaseDisposition( nPhase) EgtSetInfo( idDisp, 'ORD', nOrd) @@ -2036,7 +2036,7 @@ function BeamExec.ProcessMachinings( PARTS, bIsFlipRot) BeamLib.RotateRawPart( PARTS[nPart], nInitialPosition - 1) -- aggiunta lavorazioni in ultima fase - _, _, _, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'STD') + _, _, _, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS, PARTS[nPart], 'STD') bProcess = bProcess or bTryToReProcess -- se bisogna riprocessare, si annulla tutto @@ -2076,7 +2076,7 @@ function BeamExec.ProcessMachinings( PARTS, bIsFlipRot) -- ===== finiti i pezzi, si scarica il restante ===== local idRestPart = EgtGetNextRawPart( PARTS[#PARTS].idRaw) if idRestPart and EgtGetRawPartBBox( idRestPart):getDimX() >= BeamData.dMinRaw then - BeamLib.AddPhaseWithRawParts( idRestPart, BeamData.ptOriXR, BeamData.dPosXR, 0) + BeamLib.AddPhaseWithRawParts( PARTS, #PARTS, BeamData.ptOriXR, BeamData.dPosXR, 0) local nPhase = EgtGetCurrPhase() local idDisp = EgtGetPhaseDisposition( nPhase) EgtSetInfo( idDisp, 'TYPE', 'REST') @@ -2352,7 +2352,7 @@ function BeamExec.ProcessAlternatives( PARTS) BeamLib.RotateRawPart( PARTS[nPart], nRotation - nCurrPosition) nCurrPosition = nRotation EgtSetInfo( idDisp, 'ROT', -2) - bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'DOWN') + bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS, PARTS[nPart], 'DOWN') bSplitAlreadyExecuted = bSplitAlreadyExecuted or bSplitExecutedOnRot bProcess = bProcess or bTryToReProcess end @@ -2361,7 +2361,7 @@ function BeamExec.ProcessAlternatives( PARTS) if MatrixResult.bSomeFeatureSide then -- se ci sono state lavorazioni in rotazione precedente devo creare altra fase. Altrimenti già creata da prima if MatrixResult.bSomeFeatureDown then - BeamLib.AddPhaseWithRawParts( PARTS[nPart].idRaw, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) + BeamLib.AddPhaseWithRawParts( PARTS, nPart, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) nPhase = EgtGetCurrPhase() idDisp = EgtGetPhaseDisposition( nPhase) EgtSetInfo( idDisp, 'ORD', nOrd) @@ -2380,14 +2380,14 @@ function BeamExec.ProcessAlternatives( PARTS) BeamLib.RotateRawPart( PARTS[nPart], nRotation - nCurrPosition) nCurrPosition = nRotation EgtSetInfo( idDisp, 'ROT', -1) - bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'SIDE') + bAreAllMachiningApplyOk, sErr, bSplitExecutedOnRot, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS, PARTS[nPart], 'SIDE') bSplitAlreadyExecuted = bSplitAlreadyExecuted or bSplitExecutedOnRot bProcess = bProcess or bTryToReProcess end -- se ci sono state lavorazioni in rotazione precedente devo creare altra fase. Altrimenti già creata da prima if MatrixResult.bSomeFeatureDown or MatrixResult.bSomeFeatureSide then - BeamLib.AddPhaseWithRawParts( PARTS[nPart].idRaw, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) + BeamLib.AddPhaseWithRawParts( PARTS, nPart, BeamData.ptOriXR, BeamData.dPosXR, EgtIf( bSplitAlreadyExecuted, BeamData.RAW_OFFSET, 0)) nPhase = EgtGetCurrPhase() idDisp = EgtGetPhaseDisposition( nPhase) EgtSetInfo( idDisp, 'ORD', nOrd) @@ -2406,7 +2406,7 @@ function BeamExec.ProcessAlternatives( PARTS) BeamLib.RotateRawPart( PARTS[nPart], nInitialPosition - 1) -- aggiunta lavorazioni in ultima fase - _, _, _, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'STD') + _, _, _, bTryToReProcess = MachiningLib.AddOperations( MACHININGS, PARTS, PARTS[nPart], 'STD') bProcess = bProcess or bTryToReProcess -- se bisogna riprocessare, si annulla tutto @@ -2440,7 +2440,7 @@ function BeamExec.ProcessAlternatives( PARTS) -- ===== finiti i pezzi, si scarica il restante ===== local idRestPart = EgtGetNextRawPart( PARTS[#PARTS].idRaw) if idRestPart and EgtGetRawPartBBox( idRestPart):getDimX() >= BeamData.dMinRaw then - BeamLib.AddPhaseWithRawParts( idRestPart, BeamData.ptOriXR, BeamData.dPosXR, 0) + BeamLib.AddPhaseWithRawParts( PARTS, #PARTS, BeamData.ptOriXR, BeamData.dPosXR, 0) local nPhase = EgtGetCurrPhase() local idDisp = EgtGetPhaseDisposition( nPhase) EgtSetInfo( idDisp, 'TYPE', 'REST') diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 7bfeb80..b23b596 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -161,17 +161,30 @@ function BeamLib.GetPartSplittingPoints( Part) end ------------------------------------------------------------------------------------------------------------- -function BeamLib.AddPhaseWithRawParts( idRaw, OriXR, PosXR, dDeltaSucc) +function BeamLib.AddPhaseWithRawParts( PARTS, nPartIndex, OriXR, PosXR, dDeltaSucc) + local Part = PARTS[nPartIndex] local nPhase = EgtAddPhase() -- si aprono i limiti tavola per permettere rotazioni di pezzi più larghi della tavola EgtSetTableAreaOffset( 2000, 2000, 2000, 2000) - local dRawMove = 0 + local dRawMove = dDeltaSucc + local bFirstRaw = true + local idRaw = Part.idRaw while idRaw do + local dPosX = 0 + for i = 1, #PARTS do + local CurrentPart = PARTS[i] + if CurrentPart.idRaw == idRaw then + dPosX = CurrentPart.dPosX + end + end + if bFirstRaw then + bFirstRaw = false + else + dRawMove = dDeltaSucc + dPosX + end EgtKeepRawPart( idRaw) EgtMoveToCornerRawPart( idRaw, OriXR, PosXR) EgtMoveRawPart( idRaw, Vector3d( - dRawMove, 0, 0)) - if dRawMove == 0 then dRawMove = dRawMove + dDeltaSucc end - dRawMove = dRawMove + EgtGetRawPartBBox( idRaw):getDimX() idRaw = EgtGetNextRawPart( idRaw) end -- salvo info nuova fase aggiunta diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index a02e068..4c3fd64 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -1184,7 +1184,7 @@ end ------------------------------------------------------------------------------------------------------------- -- funzione per aggiungere una nuova lavorazione -function MachiningLib.AddOperations( MACHININGS, Part, sRotation) +function MachiningLib.AddOperations( MACHININGS, PARTS, Part, sRotation) local nErr local sErr = '' local bAreAllMachiningApplyOk = true @@ -1452,7 +1452,7 @@ function MachiningLib.AddOperations( MACHININGS, Part, sRotation) bSplitExecuted = true MACHININGS.Info.bSplitExecuted = true - BeamLib.AddPhaseWithRawParts( Part.idRaw, BeamData.ptOriXR, BeamData.dPosXR, BeamData.RAW_OFFSET) + BeamLib.AddPhaseWithRawParts( PARTS, Part.nIndexInParts, BeamData.ptOriXR, BeamData.dPosXR, BeamData.RAW_OFFSET) -- se grezzo successivo senza pezzi e finale, va tolto local nNextRawId = EgtGetNextRawPart( Part.idRaw) if nNextRawId and EgtGetPartInRawPartCount( nNextRawId) == 0 and EgtGetRawPartBBox( nNextRawId):getDimX() < BeamData.dMinRaw then