From 06a4316efa7ea0c07ded8fe9b003c0274dff465f Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Thu, 2 Jul 2026 16:36:10 +0200 Subject: [PATCH 1/4] - in BeamExec.ProcessAlternatives per il calcolo delle info testa coda si usano sempre le feature nella rotazione principale e si ruotano direttamente i punti/versori --- LuaLibs/BeamExec.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 3ecb70e..c7ca8fd 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -2388,6 +2388,8 @@ function BeamExec.ProcessAlternatives( PARTS) local HeadCut = PROCESSINGS[nPart].Rotation[nRotHeadCut+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc] local TailCut = PROCESSINGS[nPart].Rotation[nRotSplitCut+nOffsetIndex][MatrixResult.nIndexTailCutInVProc] + local HeadCutOnFirstRotation = PROCESSINGS[nPart].Rotation[1+nOffsetIndex][MatrixResult.nIndexHeadCutInVProc] + local TailCutOnFirstRotation = PROCESSINGS[nPart].Rotation[1+nOffsetIndex][MatrixResult.nIndexTailCutInVProc] -- setto nella Proc l'indice rotazione nella quale deve essere lavorata HeadCut.nIndexRotation = nRotHeadCut @@ -2429,7 +2431,7 @@ function BeamExec.ProcessAlternatives( PARTS) -- aggiornamento info testa/coda per Nesting local nRotation = BeamLib.ConvertBitIndexToRotationIndex( BestCombination.sBitIndexCombination) local sBitIndexCombinationWithInvert = BestCombination.sBitIndexCombination .. EgtIf( BestCombination.bPartInCombiIsInverted, '_INV', '') - local HeadcutInfo, TailcutInfo = GetHeadTailInfoForNesting( HeadCut, TailCut, PARTS[nPart]) + local HeadcutInfo, TailcutInfo = GetHeadTailInfoForNesting( HeadCutOnFirstRotation, TailCutOnFirstRotation, PARTS[nPart]) if HeadcutInfo then -- offset e vettori vanno adeguati alla rotazione attuale (inversione è già corretta) BeamLib.RotateTableFromIndexInPlace( HeadcutInfo.OffsetX, nRotation) From 3a1c98b8ebe1b38ccf2a40ce58871d026a4a500a Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Fri, 3 Jul 2026 10:16:03 +0200 Subject: [PATCH 2/4] - in BeamExec si pulisce il tempgroup dopo ogni chiamata della Make di una strategia (evita problemi di memoria) --- LuaLibs/BeamExec.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index c7ca8fd..8de2651 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1174,6 +1174,9 @@ local function CalculateStrategies( vProcSingleRot, Part) -- eseguo la strategia solo come calcolo fattibilità e voto. Non si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati _, Proc.AvailableStrategies[nIndexCurrentStrategy].Result = CurrentStrategy.Script.Make( false, Proc, Part, Proc.AvailableStrategies[nIndexCurrentStrategy]) + -- pulizia eventuali geometrie aggiutive create dalla strategia + EgtEmptyGroup( Part.idTempGroup) + -- se taglio di testa o coda sostitutivo non applicabile si ripristina l'originale if Proc.AvailableStrategies[nIndexCurrentStrategy].Result.sStatus ~= 'Completed' then if ID.IsHeadCut( Proc) and not Proc.bIsOriginalHeadcut then @@ -1431,6 +1434,8 @@ local function CalculateMachinings( vProc, Part, nInitialRotation) local StrategyScript = require( StrategyScriptName) -- eseguo la strategia e si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati local _, Result = StrategyScript.Make( true, Proc, Part, Proc.ChosenStrategy) + -- pulizia eventuali geometrie aggiutive create dalla strategia + EgtEmptyGroup( Part.idTempGroup) -- per i tagli di testa e coda, che non hanno girato nel CalculateStrategies, si devono settare i risultati if ( ID.IsHeadCut( Proc) or ID.IsTailCut( Proc)) and not Proc.ChosenStrategy.Result then Proc.ChosenStrategy.Result = Result From 27ce6a30cea61333b3978c9a0fb563dc554f1287 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 7 Jul 2026 11:59:45 +0200 Subject: [PATCH 3/4] - per lama aggiunti attacchi speciali SpecialTangent e SpecialTangentInverted --- LuaLibs/LeadInOutLib.lua | 44 +++++++++++++++++++++++++++++++++++++ LuaLibs/MachiningLib.lua | 47 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/LuaLibs/LeadInOutLib.lua b/LuaLibs/LeadInOutLib.lua index 3c8dd34..e4bc95e 100644 --- a/LuaLibs/LeadInOutLib.lua +++ b/LuaLibs/LeadInOutLib.lua @@ -215,6 +215,50 @@ function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters, OptionalPa -- punti dell'attacco LeadIn.ptPoint = Point3d( ptStartAtDepth - Edge.vtEdge * dLeadInLength) LeadOut.ptPoint = Point3d( ptEndAtDepth + Edge.vtEdge * dLeadOutLength) + + elseif sLeadInOutType == 'SpecialTangent' then + + -- ingresso con componente aggiuntiva perpendicolare + LeadIn.nType = MCH_MILL_LO.PERP_TG + local dStartEndOffset = 10 + local ptEndAtDepthWithOffset = ptEndAtDepth + Edge.vtN * dStartEndOffset + local ptEndBladeCenterWithOffset = ptEndBladeCenter + Edge.vtN * dStartEndOffset + + -- calcolo distanza per uscire dal box con questa lama nella direzione tangenziale + local dLeadInLength = CalculateLeadInOutLength( ptStartBladeCenter, Face.vtN, b3BoxPartExpanded, -Edge.vtEdge, Tool) + local dLeadOutLength = -CalculateLeadInOutLength( ptEndBladeCenterWithOffset, Face.vtN, b3BoxPartExpanded, -Edge.vtEdge, Tool) + + -- componenti dell'attacco + LeadIn.dPerpDistance = 0 + LeadIn.dTangentDistance = dLeadInLength + LeadOut.dPerpDistance = dStartEndOffset + LeadOut.dTangentDistance = dLeadOutLength + + -- punti dell'attacco + LeadIn.ptPoint = Point3d( ptStartAtDepth - Edge.vtEdge * dLeadInLength) + LeadOut.ptPoint = Point3d( ptEndAtDepthWithOffset + Edge.vtEdge * dLeadOutLength) + + elseif sLeadInOutType == 'SpecialTangentInverted' then + + -- ingresso con componente aggiuntiva perpendicolare + LeadIn.nType = MCH_MILL_LI.TG_PERP + local dStartEndOffset = 10 + local ptStartAtDepthWithOffset = ptStartAtDepth + Edge.vtN * dStartEndOffset + local ptStartBladeCenterWithOffset = ptStartBladeCenter + Edge.vtN * dStartEndOffset + + -- calcolo distanza per uscire dal box con questa lama nella direzione tangenziale + local dLeadInLength = -CalculateLeadInOutLength( ptStartBladeCenterWithOffset, Face.vtN, b3BoxPartExpanded, Edge.vtEdge, Tool) + local dLeadOutLength = CalculateLeadInOutLength( ptEndBladeCenter, Face.vtN, b3BoxPartExpanded, Edge.vtEdge, Tool) + + -- componenti dell'attacco + LeadIn.dPerpDistance = dStartEndOffset + LeadIn.dTangentDistance = dLeadInLength + LeadOut.dPerpDistance = 0 + LeadOut.dTangentDistance = dLeadOutLength + + -- punti dell'attacco + LeadIn.ptPoint = Point3d( ptStartAtDepthWithOffset - Edge.vtEdge * dLeadInLength) + LeadOut.ptPoint = Point3d( ptEndAtDepth + Edge.vtEdge * dLeadOutLength) end -- lunghezza totale attacco diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 77f77c3..39388b5 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -411,6 +411,53 @@ local function TestEngagement( sBladeEngagement, Parameters, OptionalParameters) end end + -- se attacco tangenziale standard non possibile si prova l'attacco tangenziale speciale tutto da un lato + if not LeadInOut.Tangent then + -- prima si prova l'invertito (il più frequente) + TangentLeadInOut = LeadInOutLib.CalculateLeadInOut( 'SpecialTangentInverted', Parameters, LeadInOutOptionalParameters) + -- check extracorsa nei punti di attacco + PointsOnToolTipCenter = { + PreSimulationLib.GetPointOnToolTipCenter( TangentLeadInOut.LeadIn.ptPoint, vtHead, Face.vtN, Edge.vtN, Tool), + PreSimulationLib.GetPointOnToolTipCenter( TangentLeadInOut.LeadOut.ptPoint, vtHead, Face.vtN, Edge.vtN, Tool) + } + bOutOfStrokeTangent = PreSimulationLib.CheckOutOfStrokeFromPoints( PointsOnToolTipCenter, vtHead, nSCC, Tool) + -- attacco tangenziale non in extracorsa: si verifica se è in collisione + if not bOutOfStrokeTangent then + CheckCollisionOptionalParameters.PointsToCheck = {} + table.insert( CheckCollisionOptionalParameters.PointsToCheck, TangentLeadInOut.LeadIn.ptPoint) + table.insert( CheckCollisionOptionalParameters.PointsToCheck, TangentLeadInOut.LeadOut.ptPoint) + local bCollisionFoundTangent, bMoveAfterSplitTangent = PreSimulationLib.CheckCollision( CheckCollisionParameters, CheckCollisionOptionalParameters) + -- attacco tangenziale possibile + if not bCollisionFoundTangent then + LeadInOut.Tangent = TangentLeadInOut + LeadInOut.Tangent.bMoveAfterSplit = bMoveAfterSplitTangent + end + end + + if not LeadInOut.Tangent then + -- se speciale invertito non applicabile si prova lo speciale non invertito + TangentLeadInOut = LeadInOutLib.CalculateLeadInOut( 'SpecialTangent', Parameters, LeadInOutOptionalParameters) + -- check extracorsa nei punti di attacco + PointsOnToolTipCenter = { + PreSimulationLib.GetPointOnToolTipCenter( TangentLeadInOut.LeadIn.ptPoint, vtHead, Face.vtN, Edge.vtN, Tool), + PreSimulationLib.GetPointOnToolTipCenter( TangentLeadInOut.LeadOut.ptPoint, vtHead, Face.vtN, Edge.vtN, Tool) + } + bOutOfStrokeTangent = PreSimulationLib.CheckOutOfStrokeFromPoints( PointsOnToolTipCenter, vtHead, nSCC, Tool) + -- attacco tangenziale non in extracorsa: si verifica se è in collisione + if not bOutOfStrokeTangent then + CheckCollisionOptionalParameters.PointsToCheck = {} + table.insert( CheckCollisionOptionalParameters.PointsToCheck, TangentLeadInOut.LeadIn.ptPoint) + table.insert( CheckCollisionOptionalParameters.PointsToCheck, TangentLeadInOut.LeadOut.ptPoint) + local bCollisionFoundTangent, bMoveAfterSplitTangent = PreSimulationLib.CheckCollision( CheckCollisionParameters, CheckCollisionOptionalParameters) + -- attacco tangenziale possibile + if not bCollisionFoundTangent then + LeadInOut.Tangent = TangentLeadInOut + LeadInOut.Tangent.bMoveAfterSplit = bMoveAfterSplitTangent + end + end + end + end + -- se disponibili più attacchi si sceglie il più corto, altrimenti quello possibile if LeadInOut.Perpendicular and LeadInOut.Tangent then if LeadInOut.Perpendicular.dTotalLength > LeadInOut.Tangent.dTotalLength + 10 then From fe721f5cb3400bd246d19b99dc7de514a4b85e14 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 7 Jul 2026 15:23:50 +0200 Subject: [PATCH 4/4] - corretto commento --- LuaLibs/LeadInOutLib.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LuaLibs/LeadInOutLib.lua b/LuaLibs/LeadInOutLib.lua index e4bc95e..4f22484 100644 --- a/LuaLibs/LeadInOutLib.lua +++ b/LuaLibs/LeadInOutLib.lua @@ -218,7 +218,7 @@ function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters, OptionalPa elseif sLeadInOutType == 'SpecialTangent' then - -- ingresso con componente aggiuntiva perpendicolare + -- uscita con componente aggiuntiva perpendicolare LeadIn.nType = MCH_MILL_LO.PERP_TG local dStartEndOffset = 10 local ptEndAtDepthWithOffset = ptEndAtDepth + Edge.vtN * dStartEndOffset