- in MachiningLib si GetBladeEngagement si controlla la collisione con tutti gli assi in modalità standard o DownUp

This commit is contained in:
luca.mazzoleni
2025-12-01 18:54:03 +01:00
parent 1e327819c6
commit cb60773216
3 changed files with 47 additions and 27 deletions
+43 -23
View File
@@ -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