diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 80378af..c689c8e 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -288,45 +288,65 @@ end -- ritorna se la faccia e il lato sono lavorabili e, se sì, il modo di lavorare (standard/DownUp) -- TODO si dovrà decidere come tagliare anche se pezzo corto (il motore non deve ingombrare con il pinzaggio) -- valutare se restituire, se disponibili, entrambe le soluzioni e demandare la decisione alla FaceByBlade -function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachine, bCollisionCheckForDownUpOnly) +function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachine, bIsDicing) local sBladeEngagement = 'Standard' - -- la normale della faccia permette di lavorare in modo standard, ma potrebbero esserci altre condizioni che fanno fallire il taglio + -- la normale della faccia permette di lavorare in modo standard, ma potrebbero esserci collisioni che fanno fallire il taglio if not IsFaceZOutOfRange( Face.vtN, Tool) then - - -- TODO La riduzione percorso cambia questo test? - -- TODO da completare questo test - -- TODO rimuovere timer qua - TIMER:startElapsed( 'CollisionZ') - local bCollisionFoundZ, bMoveAfterSplitZ = PreCollisionLib.CheckCollisionWithAxis( 'Z', Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) - TIMER:stopElapsed( 'CollisionZ') - --local bCollisionFound, bMoveAfterSplit = PreCollisionLib.CheckCollisionAxisAB( Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) - local bCollisionFound, bMoveAfterSplit = PreCollisionLib.CheckCollisionWithAxis( 'AB', Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) - if bCollisionCheckForDownUpOnly or not bCollisionFound then + -- se cubetti si controlla solo asse Z (ci sarebbe collisione con il materiale già rimosso) + if bIsDicing then + local bCollisionFound, bMoveAfterSplit = PreCollisionLib.CheckCollisionWithAxis( 'Z', Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) + + return not bCollisionFound, sBladeEngagement, bMoveAfterSplit + end + + local bMoveAfterSplit = false + + local bCollisionFoundZ, bMoveAfterSplitZ = PreCollisionLib.CheckCollisionWithAxis( 'Z', Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) + + local bCollisionFoundC, bMoveAfterSplitC = PreCollisionLib.CheckCollisionWithAxis( 'C', Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) + + local bCollisionFoundAB, bMoveAfterSplitAB = PreCollisionLib.CheckCollisionWithAxis( 'AB', Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) + + -- se nessuna collisione trovata si ritorna lavorazione fattibile, altrimenti si proseguirà al DownUp + if not ( bCollisionFoundZ or bCollisionFoundC or bCollisionFoundAB) then + if bMoveAfterSplitZ or bMoveAfterSplitC or bMoveAfterSplitAB then + bMoveAfterSplit = true + end return true, sBladeEngagement, bMoveAfterSplit end end -- faccia non lavorabile in modo standard: si verifica se il DownUp è fattibile + -- la normale della faccia non permette il DownUp: non lavorabile in DownUp (se taglio DownUp la faccia è lavorata al contrario, vtN opposta) if IsFaceZOutOfRange( -Face.vtN, Tool) then return false end - -- orientamento faccia / utensile compatibili con DownUp: lavorabile - --local bCollisionFound, bMoveAfterSplit = PreCollisionLib.CheckCollisionAxisAB( Edge, Face.vtN, -Face.vtN, Part, Tool, dDepthToMachine) - local bCollisionFound, bMoveAfterSplit = PreCollisionLib.CheckCollisionWithAxis( 'AB', Edge, Face.vtN, -Face.vtN, Part, Tool, dDepthToMachine) - if not bCollisionFound then - - sBladeEngagement = 'DownUp' - - return true, sBladeEngagement, bMoveAfterSplit + local bCollisionFoundZ, bMoveAfterSplitZ = PreCollisionLib.CheckCollisionWithAxis( 'Z', Edge, Face.vtN, -Face.vtN, Part, Tool, dDepthToMachine) + if bCollisionFoundZ then + return false end - return false + local bCollisionFoundC, bMoveAfterSplitC = PreCollisionLib.CheckCollisionWithAxis( 'C', Edge, Face.vtN, -Face.vtN, Part, Tool, dDepthToMachine) + if bCollisionFoundC then + return false + end + + local bCollisionFoundAB, bMoveAfterSplitAB = PreCollisionLib.CheckCollisionWithAxis( 'AB', Edge, Face.vtN, -Face.vtN, Part, Tool, dDepthToMachine) + if bCollisionFoundAB then + return false + end + + -- se si è arrivati qui il DownUp è fattibile + sBladeEngagement = 'DownUp' + local bMoveAfterSplit = bMoveAfterSplitZ or bMoveAfterSplitC or bMoveAfterSplitAB + + return true, sBladeEngagement, bMoveAfterSplit end ------------------------------------------------------------------------------------------------------------- @@ -472,7 +492,7 @@ function MachiningLib.FindBlade( Proc, ToolSearchParameters) local bForceLongcutBlade = ToolSearchParameters.bForceLongcutBlade or false local EdgeToMachine = ToolSearchParameters.EdgeToMachine local Part = ToolSearchParameters.Part - local bCollisionCheckForDownUpOnly = ToolSearchParameters.bCollisionCheckForDownUpOnly or false + local bIsDicing = ToolSearchParameters.bIsDicing or false local nBestToolIndex local dBestToolResidualDepth = 0 @@ -498,7 +518,7 @@ function MachiningLib.FindBlade( Proc, ToolSearchParameters) if FaceToMachine and EdgeToMachine and Part and dElevation then local bIsBladeOk = false TIMER:startElapsed( 'GetBladeEngagement') - bIsBladeOk, sCurrentBladeEngagement, bCurrentMoveAfterSplit = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[i], dElevation, bCollisionCheckForDownUpOnly) + bIsBladeOk, sCurrentBladeEngagement, bCurrentMoveAfterSplit = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[i], dElevation, bIsDicing) TIMER:stopElapsed( 'GetBladeEngagement') -- orientamento non raggiungibile if not bIsBladeOk then diff --git a/StrategyLibs/BLADETOWASTE.lua b/StrategyLibs/BLADETOWASTE.lua index 4327116..55885c7 100644 --- a/StrategyLibs/BLADETOWASTE.lua +++ b/StrategyLibs/BLADETOWASTE.lua @@ -897,7 +897,7 @@ local function CutWithDicing( Proc, Part, OptionalParameters) nToolIndex = nToolIndex, dRadialStepSpan = 0, dExtendAfterTail = dExtendAfterTail, - bCollisionCheckForDownUpOnly = true + bIsDicing = true } Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0) diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 4c7924d..3cc51fa 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -260,7 +260,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar end local dRadialStepSpan = OptionalParameters.dRadialStepSpan local sUserNotes = OptionalParameters.sUserNotes or '' - local bCollisionCheckForDownUpOnly = OptionalParameters.bCollisionCheckForDownUpOnly or false + local bIsDicing = OptionalParameters.bIsDicing or false -- lunghezze, direzioni e punti caratteristici della lavorazione e del lato lavorato Cutting.dEdgeLength = EdgeToMachine.dLength @@ -275,7 +275,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar Cutting.nToolIndex = nToolIndex TIMER:startElapsed( 'GetBladeEngagement') - Cutting.bIsApplicable, Cutting.sBladeEngagement, Cutting.bMoveAfterSplit = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[Cutting.nToolIndex], dDepthToMachine, bCollisionCheckForDownUpOnly) + Cutting.bIsApplicable, Cutting.sBladeEngagement, Cutting.bMoveAfterSplit = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[Cutting.nToolIndex], dDepthToMachine, bIsDicing) TIMER:stopElapsed( 'GetBladeEngagement') -- utensile da cercare: si prende la lama migliore che può effettuare questo taglio, senza particolari analisi @@ -358,7 +358,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar -- lavorando dalla direzione opposta si verifica come se si lavorasse il lato opposto TIMER:startElapsed( 'GetBladeEngagement') - local bIsApplicableOpposite, sBladeEngagementOpposite, bMoveAfterSplit = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachineOpposite, Part, TOOLS[Cutting.nToolIndex], dDepthToMachine, bCollisionCheckForDownUpOnly) + local bIsApplicableOpposite, sBladeEngagementOpposite, bMoveAfterSplit = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachineOpposite, Part, TOOLS[Cutting.nToolIndex], dDepthToMachine, bIsDicing) TIMER:stopElapsed( 'GetBladeEngagement') -- taglio opposto non fattibile