From af971f70fc4c006fb9ffffb7f3d410eaf2c2ae88 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Thu, 17 Jul 2025 18:34:31 +0200 Subject: [PATCH] - in BLADETOWASTE aggiunto CutWholeWaste da due lati anche verticali (GetDualSideCutStrategy) - in FACEBYBLADE correzione ai tagli ridotti --- StrategyLibs/BLADETOWASTE.lua | 294 ++++++++++++++++++---------------- StrategyLibs/FACEBYBLADE.lua | 5 +- 2 files changed, 163 insertions(+), 136 deletions(-) diff --git a/StrategyLibs/BLADETOWASTE.lua b/StrategyLibs/BLADETOWASTE.lua index 4047ad3..d63e5ab 100644 --- a/StrategyLibs/BLADETOWASTE.lua +++ b/StrategyLibs/BLADETOWASTE.lua @@ -273,26 +273,26 @@ local function GetBestBlade( Proc, Part, Face, OptionalParameters) nToolIndexBottom = OptionalParameters.nToolIndex end end + -- non ho l'untensile, devo cercarlo e scegliere il migliore tra testa sopra e sotto else local ToolInfo - -- ricerca lama testa sopra - local ToolSearchParameters = {} - ToolSearchParameters.vtN = Face.vtN - ToolSearchParameters.bAllowTopHead = true - ToolSearchParameters.bAllowBottomHead = false - ToolSearchParameters.dElevation = dElevationTop - ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters) + ToolInfo = MachiningLib.FindBlade( Proc, { + vtN = Face.vtN, + bAllowTopHead = true, + bAllowBottomHead = false, + dElevation = dElevationTop + }) if ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then nToolIndexTop = ToolInfo.nToolIndex end -- ricerca lama testa sotto - ToolSearchParameters = {} - ToolSearchParameters.vtN = Face.vtN - ToolSearchParameters.bAllowTopHead = false - ToolSearchParameters.bAllowBottomHead = true - ToolSearchParameters.dElevation = dElevationBottom - ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters) + ToolInfo = MachiningLib.FindBlade( Proc, { + vtN = Face.vtN, + bAllowTopHead = false, + bAllowBottomHead = true, + dElevation = dElevationBottom + }) if ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then nToolIndexBottom = ToolInfo.nToolIndex end @@ -365,9 +365,8 @@ end local function GetSingleCutStrategy( Proc, Part, OptionalParameters) - OptionalParameters = OptionalParameters or {} - local FaceToMachine = Proc.Faces[1] + local sChosenBladeType -- lati da lavorare in base al tipo di lama local EdgeToMachineList = { @@ -377,9 +376,10 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters) TopGuillotine = GetEdgeToMachine(FaceToMachine.Edges, FaceToMachine.vtN, 'TopGuillotine') } + -- parametri opzionali + OptionalParameters = OptionalParameters or {} local nToolIndex = OptionalParameters.nToolIndex local bReduceBladePath = OptionalParameters.bReduceBladePath - local sChosenBladeType -- se nToolIndex è presente, GetBestBlade sceglierà solo il lato, altrimenti sceglierà lama e lato local OptionalParametersGetBestBlade = { @@ -393,12 +393,11 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters) -- se possibile, upgrade del taglio tipo 'Top' a taglio a ghigliottina if sChosenBladeType == 'Top' and bReduceBladePath and FaceData.IsFaceRectangular( Proc, FaceToMachine.id) then -- ricerca lama migliore testa sopra - local ToolSearchParameters = {} - ToolSearchParameters.vtN = Proc.Faces[1].vtN - ToolSearchParameters.bAllowTopHead = true - ToolSearchParameters.bAllowBottomHead = false - ToolSearchParameters.dElevation = nil - local ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters) + local ToolInfo = MachiningLib.FindBlade( Proc, { + vtN = Proc.Faces[1].vtN, + bAllowTopHead = true, + bAllowBottomHead = false + }) -- test fattibilità taglio a ghigliottina if ToolInfo.nToolIndex then @@ -415,14 +414,129 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters) end +local function GetDualSideCutStrategy( Proc, OptionalParameters) + + local FaceToMachine = Proc.Faces[1] + + -- parametri opzionali + OptionalParameters = OptionalParameters or {} + local nToolIndex = OptionalParameters.nToolIndex + + local CuttingParametersList + local EdgeToMachine + + -- se possibile, si prova il doppio taglio orizzontale con mix testa sopra/sotto (questa modalità si esclude se l'utensile arriva dall'esterno) + -- TODO valutare se farlo anche doppio orizzontale solo con testa sopra, se la lama ha la corsa per andare sotto! + EdgeToMachine = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'HorizontalBottom') + if not nToolIndex and AreSameOrOppositeVectorApprox( EdgeToMachine.vtN, Z_AX()) then + + -- inizialmente si prova a lavorare in mezzeria + local dDepthToMachineTop = EdgeToMachine.dElevation / 2 + BeamData.CUT_EXTRA_MIN + local dDepthToMachineBottom = dDepthToMachineTop + + -- ricerca lama testa sopra + local ToolInfoTopBlade = MachiningLib.FindBlade( Proc, { + vtN = FaceToMachine.vtN, + bAllowTopHead = true, + bAllowBottomHead = false, + dElevation = dDepthToMachineTop + }) + -- ricerca lama testa sotto + local ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, { + vtN = FaceToMachine.vtN, + bAllowTopHead = false, + bAllowBottomHead = true, + dElevation = dDepthToMachineBottom + }) + + local bIsTopLimited = ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL + local bIsBottomLimited = ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL + + -- testa sopra limitante + if bIsTopLimited and not bIsBottomLimited then + -- ricalcolo profondità di lavoro + dDepthToMachineTop = TOOLS[ToolInfoTopBlade.nToolIndex].dMaxMaterial + dDepthToMachineBottom = EdgeToMachine.dElevation - dDepthToMachineTop + BeamData.CUT_EXTRA_MIN + -- ricerca lama sotto con la nuova depth + ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, { + vtN = FaceToMachine.vtN, + bAllowTopHead = false, + bAllowBottomHead = true, + dElevation = dDepthToMachineBottom + }) + bIsBottomLimited = ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL + + -- testa sotto limitante + elseif bIsBottomLimited and not bIsTopLimited then + -- ricalcolo profondità di lavoro + dDepthToMachineBottom = TOOLS[ToolInfoBottomBlade.nToolIndex].dMaxMaterial + dDepthToMachineTop = EdgeToMachine.dElevation - dDepthToMachineBottom + BeamData.CUT_EXTRA_MIN + -- ricerca lama sopra con la nuova depth + ToolInfoTopBlade = MachiningLib.FindBlade( Proc, { + vtN = FaceToMachine.vtN, + bAllowTopHead = true, + bAllowBottomHead = false, + dElevation = dDepthToMachineTop + }) + bIsTopLimited = ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL + end + + -- se almeno una delle due lame ci arriva si assegnano utensili e profondità da ritornare + if not ( bIsTopLimited and bIsBottomLimited) and ToolInfoTopBlade.nToolIndex and ToolInfoBottomBlade.nToolIndex then + CuttingParametersList = { + { + nToolIndex = ToolInfoBottomBlade.nToolIndex, + dDepthToMachine = dDepthToMachineBottom + }, + { + nToolIndex = ToolInfoTopBlade.nToolIndex, + dDepthToMachine = dDepthToMachineTop + } + } + + return CuttingParametersList, EdgeToMachine + end + end + + -- arrivati qui si prova il taglio doppio verticale (taglio doppio orizzontale non si può fare oppure non ci arriva) + EdgeToMachine = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'Vertical') + local dDepthToMachine = EdgeToMachine.dElevation / 2 + BeamData.CUT_EXTRA_MIN + + -- ricerca lama testa sopra + local ToolInfo = MachiningLib.FindBlade( Proc, { + vtN = FaceToMachine.vtN, + bAllowTopHead = true, + bAllowBottomHead = false, + dElevation = dDepthToMachine + }) + + -- se lama ci arriva si assegnano utensili e profondità da ritornare + if ToolInfo.nToolIndex and ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then + CuttingParametersList = { + { + nToolIndex = ToolInfo.nToolIndex, + dDepthToMachine = dDepthToMachine + }, + { + nToolIndex = ToolInfo.nToolIndex, + dDepthToMachine = dDepthToMachine + } + } + else + EdgeToMachine = nil + end + + return CuttingParametersList, EdgeToMachine +end + + local function CutWholeWaste( Proc, Part, OptionalParameters) local Machinings = {} local Cutting = nil local CuttingDouble = nil local Result = {} - local EdgeToMachine = {} + local EdgeToMachine local sChosenBladeType = '' - local dDepthToMachine = 0 local dCompletionPercentage = 0 -- controlli preventivi @@ -445,9 +559,8 @@ local function CutWholeWaste( Proc, Part, OptionalParameters) -- se taglio da un lato ce la fa, si crea la lavorazione if nToolIndex then - dDepthToMachine = EdgeToMachine.dElevation + BeamData.CUT_EXTRA local OptionalParametersFaceByBlade = { - dDepthToMachine = dDepthToMachine, + dDepthToMachine = EdgeToMachine.dElevation + BeamData.CUT_EXTRA, nToolIndex = nToolIndex, dExtendAfterTail = dExtendAfterTail, bReduceBladePath = bReduceBladePath @@ -462,118 +575,29 @@ local function CutWholeWaste( Proc, Part, OptionalParameters) -- TODO valutare se estendere ai non parallelogrammi elseif FaceData.IsFaceRhomboid( Proc, Proc.Faces[1].id) then - EdgeToMachine = GetEdgeToMachine( Proc.Faces[1].Edges, Proc.Faces[1].vtN, 'HorizontalBottom') - -- se possibile, si prova il doppio taglio orizzontale con mix testa sopra/sotto - -- TODO valutare se farlo anche doppio orizzontale solo con testa sopra, se la lama ha la corsa per andare sotto - if BeamData.DOWN_HEAD and AreSameOrOppositeVectorApprox( EdgeToMachine.vtN, Z_AX()) then - -- inizialmente si prova a lavorare in mezzeria - dDepthToMachine = EdgeToMachine.dElevation / 2 + BeamData.CUT_EXTRA_MIN - local dDepthToMachineDouble = dDepthToMachine + local CuttingParametersList + CuttingParametersList, EdgeToMachine = GetDualSideCutStrategy( Proc, OptionalParameters) - -- ricerca lama testa sotto - local ToolSearchParameters = {} - ToolSearchParameters.vtN = Proc.Faces[1].vtN - ToolSearchParameters.bAllowTopHead = false - ToolSearchParameters.bAllowBottomHead = true - ToolSearchParameters.dElevation = dDepthToMachine - local ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters) - local nToolIndexBottomBlade = ToolInfoBottomBlade.nToolIndex - -- ricerca lama testa sopra - ToolSearchParameters = {} - ToolSearchParameters.vtN = Proc.Faces[1].vtN - ToolSearchParameters.bAllowTopHead = true - ToolSearchParameters.bAllowBottomHead = false - ToolSearchParameters.dElevation = dDepthToMachine - local ToolInfoTopBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters) - local nToolIndexTopBlade = ToolInfoTopBlade.nToolIndex + if CuttingParametersList then + local OptionalParametersFaceByBlade = { + dDepthToMachine = CuttingParametersList[1].dDepthToMachine, + nToolIndex = CuttingParametersList[1].nToolIndex, + dExtendAfterTail = dExtendAfterTail, + bReduceBladePath = bReduceBladePath, + OppositeToolDirectionMode = 'Enabled' + } + local OptionalParametersFaceByBladeDouble = { + dDepthToMachine = CuttingParametersList[2].dDepthToMachine, + nToolIndex = CuttingParametersList[2].nToolIndex, + dExtendAfterTail = dExtendAfterTail, + bReduceBladePath = bReduceBladePath + } - -- si può lavorare in mezzeria - if ( ToolInfoTopBlade.dResidualDepth <= 10 * GEO.EPS_SMALL) - and ( ToolInfoBottomBlade.dResidualDepth <= 10 * GEO.EPS_SMALL) then - - local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, - nToolIndex = nToolIndexBottomBlade, - dExtendAfterTail = dExtendAfterTail, - bReduceBladePath = bReduceBladePath, - OppositeToolDirectionMode = 'Enabled' - } - local OptionalParametersFaceByBladeDouble = { dDepthToMachine = dDepthToMachineDouble, - nToolIndex = nToolIndexTopBlade, - dExtendAfterTail = dExtendAfterTail, - bReduceBladePath = bReduceBladePath - } - - Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade) - CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble) - - -- testa sopra limitante - elseif ( ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL) - and ( ToolInfoBottomBlade.dResidualDepth <= 10 * GEO.EPS_SMALL) then - - dDepthToMachineDouble = TOOLS[nToolIndexTopBlade].dMaxMaterial - dDepthToMachine = EdgeToMachine.dElevation - dDepthToMachineDouble + BeamData.CUT_EXTRA_MIN - - -- ricerca lama testa sotto - ToolSearchParameters = {} - ToolSearchParameters.vtN = Proc.Faces[1].vtN - ToolSearchParameters.bAllowTopHead = false - ToolSearchParameters.bAllowBottomHead = true - ToolSearchParameters.dElevation = dDepthToMachine - ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters) - nToolIndexBottomBlade = ToolInfoBottomBlade.nToolIndex - - if ToolInfoBottomBlade.dResidualDepth < 10 * GEO.EPS_SMALL then - local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, - nToolIndex = nToolIndexBottomBlade, - dExtendAfterTail = dExtendAfterTail, - bReduceBladePath = bReduceBladePath, - OppositeToolDirectionMode = 'Enabled' - } - local OptionalParametersFaceByBladeDouble = { dDepthToMachine = dDepthToMachineDouble, - nToolIndex = nToolIndexTopBlade, - dExtendAfterTail = dExtendAfterTail, - bReduceBladePath = bReduceBladePath - } - - Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade) - CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble) - end - - -- testa sotto limitante - elseif ( ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL) - and ( ToolInfoTopBlade.dResidualDepth <= 10 * GEO.EPS_SMALL) then - - dDepthToMachine = TOOLS[nToolIndexBottomBlade].dMaxMaterial - dDepthToMachineDouble = EdgeToMachine.dElevation - dDepthToMachine + BeamData.CUT_EXTRA_MIN - - -- ricerca lama testa sopra - ToolSearchParameters = {} - ToolSearchParameters.vtN = Proc.Faces[1].vtN - ToolSearchParameters.bAllowTopHead = true - ToolSearchParameters.bAllowBottomHead = false - ToolSearchParameters.dElevation = dDepthToMachineDouble - ToolInfoTopBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters) - nToolIndexTopBlade = ToolInfoTopBlade.nToolIndex - - if ToolInfoTopBlade.dResidualDepth < 10 * GEO.EPS_SMALL then - local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, - nToolIndex = nToolIndexBottomBlade, - dExtendAfterTail = dExtendAfterTail, - bReduceBladePath = bReduceBladePath, - OppositeToolDirectionMode = 'Enabled' - } - local OptionalParametersFaceByBladeDouble = { dDepthToMachine = dDepthToMachineDouble, - nToolIndex = nToolIndexTopBlade, - dExtendAfterTail = dExtendAfterTail, - bReduceBladePath = bReduceBladePath - } - - Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade) - CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble) - end - end + Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade) + CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble) end - + + end if Cutting and Cutting.bIsApplicable then diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 46bafb9..14d08f2 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -199,7 +199,10 @@ function FACEBYBLADE.GetPathReductionLength( nToolIndex, dRadialOffset, Optional local dExtra = OptionalParameters.dExtra or BeamData.CUT_EXTRA -- calcolo - local dReductionLength = sqrt( ( dToolRadius - dExtra)^2 - ( dToolRadius - dRadialOffset)^2) + local dReductionLength = -dExtra + if dRadialOffset > dExtra + 10 * GEO.EPS_SMALL then + dReductionLength = sqrt( ( dToolRadius - dExtra)^2 - ( dToolRadius - dRadialOffset)^2) + end return dReductionLength end