From f426311b2835805cb64b46d12b99db08d059d712 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Fri, 5 Dec 2025 11:42:00 +0100 Subject: [PATCH] in MachiningLib.GetBladeEngagement refactoring --- LuaLibs/MachiningLib.lua | 75 ++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 614afb3..eb8b92e 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -284,12 +284,49 @@ local function IsFaceZOutOfRange( vtNFace, Tool) return false end +------------------------------------------------------------------------------------------------------------- +local function CheckCollision( sBladeEngagement, Parameters, OptionalParameters) + + local bCollisionFound + local bMoveAfterSplitZ, bMoveAfterSplitC, bMoveAfterSplitAB + + -- parametri opzionali, in parte da far transitare + OptionalParameters = OptionalParameters or {} + local OptionalParametersCheckCollisionWithAxis = {} + OptionalParametersCheckCollisionWithAxis.bCheckOnlyRestlength = false + if OptionalParameters.MachiningPoints then + OptionalParametersCheckCollisionWithAxis.MachiningPoints = BeamLib.TableCopyDeep( OptionalParameters.MachiningPoints) + end + + -- asse Z si controlla sempre + bCollisionFound, bMoveAfterSplitZ = PreSimulationLib.CheckCollisionWithAxis( 'Z', Parameters, OptionalParametersCheckCollisionWithAxis) + + -- se cubetti in modalità standard (no DownUp), gli assi AB e C si controllano solo con grezzo (ci sarebbe collisione con il materiale già rimosso controllando AB e C con pezzo) + if sBladeEngagement == 'Standard' then + OptionalParametersCheckCollisionWithAxis.bCheckOnlyRestlength = OptionalParameters.bIsDicing or false + end + + if not bCollisionFound then + bCollisionFound, bMoveAfterSplitAB = PreSimulationLib.CheckCollisionWithAxis( 'AB', Parameters, OptionalParametersCheckCollisionWithAxis) + end + + if not bCollisionFound then + bCollisionFound, bMoveAfterSplitC = PreSimulationLib.CheckCollisionWithAxis( 'C', Parameters, OptionalParametersCheckCollisionWithAxis) + end + + local bMoveAfterSplit = bMoveAfterSplitZ or bMoveAfterSplitC or bMoveAfterSplitAB + + return bCollisionFound, bMoveAfterSplit +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) -- TODO da gestire riduzione percorso function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) + local sBladeEngagement = 'Standard' + -- parametri obbligatori local Face = Parameters.Face local Edge = Parameters.Edge @@ -302,12 +339,8 @@ function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) local bIsDicing = OptionalParameters.bIsDicing or false -- la normale della faccia permette di lavorare in modo standard, ma potrebbero esserci collisioni che fanno fallire il taglio - -- se cubetti si controlla con pezzo solo asse Z e grezzo con tutti (ci sarebbe collisione con il materiale già rimosso controllando AB e C con pezzo) if not IsFaceZOutOfRange( Face.vtN, Tool) then - local bCollisionFound - local bMoveAfterSplitZ, bMoveAfterSplitC, bMoveAfterSplitAB - local CheckCollisionParameters = { Edge = Edge, vtNFace = Face.vtN, @@ -316,27 +349,21 @@ function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) Tool = Tool, dDepthToMachine = dDepthToMachine } + local CheckCollisionOptionalParameters = { + bIsDicing = bIsDicing + } - bCollisionFound, bMoveAfterSplitZ = PreSimulationLib.CheckCollisionWithAxis( 'Z', CheckCollisionParameters) - - if not bCollisionFound then - bCollisionFound, bMoveAfterSplitC = PreSimulationLib.CheckCollisionWithAxis( 'C', CheckCollisionParameters, { bCheckOnlyRestlength = bIsDicing}) - end - - if not bCollisionFound then - bCollisionFound, bMoveAfterSplitAB = PreSimulationLib.CheckCollisionWithAxis( 'AB', CheckCollisionParameters, { bCheckOnlyRestlength = bIsDicing}) - end + local bCollisionFound, bMoveAfterSplit = CheckCollision( sBladeEngagement, CheckCollisionParameters, CheckCollisionOptionalParameters) -- se nessuna collisione trovata si ritorna lavorazione fattibile, altrimenti si proseguirà al DownUp if not bCollisionFound then - local sBladeEngagement = 'Standard' - local bMoveAfterSplit = bMoveAfterSplitZ or bMoveAfterSplitC or bMoveAfterSplitAB return true, sBladeEngagement, bMoveAfterSplit, sLeadInOutType end end -- faccia non lavorabile in modo standard: si verifica se il DownUp è fattibile + sBladeEngagement = 'DownUp' -- 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 @@ -344,9 +371,6 @@ function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) return false end - local bCollisionFound - local bMoveAfterSplitZ, bMoveAfterSplitC, bMoveAfterSplitAB - local CheckCollisionParameters = { Edge = Edge, vtNFace = Face.vtN, @@ -355,21 +379,12 @@ function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) Tool = Tool, dDepthToMachine = dDepthToMachine } + local CheckCollisionOptionalParameters = {} - bCollisionFound, bMoveAfterSplitZ = PreSimulationLib.CheckCollisionWithAxis( 'Z', CheckCollisionParameters) + local bCollisionFound, bMoveAfterSplit = CheckCollision( sBladeEngagement, CheckCollisionParameters, CheckCollisionOptionalParameters) + -- se nessuna collisione il DownUp è fattibile if not bCollisionFound then - bCollisionFound, bMoveAfterSplitC = PreSimulationLib.CheckCollisionWithAxis( 'C', CheckCollisionParameters) - end - - if not bCollisionFound then - bCollisionFound, bMoveAfterSplitAB = PreSimulationLib.CheckCollisionWithAxis( 'AB', CheckCollisionParameters) - end - - -- se si è arrivati qui senza collisioni il DownUp è fattibile - if not bCollisionFound then - local sBladeEngagement = 'DownUp' - local bMoveAfterSplit = bMoveAfterSplitZ or bMoveAfterSplitC or bMoveAfterSplitAB return true, sBladeEngagement, bMoveAfterSplit, sLeadInOutType end