diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index e063b4d..d857dde 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -285,7 +285,43 @@ local function IsFaceZOutOfRange( vtNFace, Tool) end ------------------------------------------------------------------------------------------------------------- +local function TestEngagement( sBladeEngagement, Parameters, OptionalParameters) + -- parametri obbligatori (parametri opzionali transitano solamente) + local Face = Parameters.Face + local Edge = Parameters.Edge + local Part = Parameters.Part + local Tool = Parameters.Tool + local dDepthToMachine = Parameters.dDepthToMachine + + -- il lato della testa cambia in base all'Engagement + local vtHead + if sBladeEngagement == 'Standard' then + vtHead = Face.vtN + elseif sBladeEngagement == 'DownUp' then + vtHead = -Face.vtN + else + error( 'TestEngagement : unknown engagement') + end + + -- se l'angolo non può essere raggiunto dall'utensile si esce subito + if IsFaceZOutOfRange( vtHead, Tool) then + return false + end + + local CheckCollisionParameters = { + Edge = Edge, + vtNFace = Face.vtN, + vtHead = vtHead, + Part = Part, + Tool = Tool, + dDepthToMachine = dDepthToMachine + } + + local bCollisionFound, bMoveAfterSplit = PreSimulationLib.CheckCollision( sBladeEngagement, CheckCollisionParameters, OptionalParameters) + + return not bCollisionFound, bMoveAfterSplit +end ------------------------------------------------------------------------------------------------------------- -- ritorna se la faccia e il lato sono lavorabili e, se sì, il modo di lavorare (standard/DownUp) @@ -293,68 +329,20 @@ end -- TODO da gestire riduzione percorso function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) - local sBladeEngagement = 'Standard' + -- test lavorazione faccia in modo standard (no DownUp) + local bIsEngagementOk, bMoveAfterSplit = TestEngagement( 'Standard', Parameters, OptionalParameters) - -- parametri obbligatori - local Face = Parameters.Face - local Edge = Parameters.Edge - local Part = Parameters.Part - local Tool = Parameters.Tool - local dDepthToMachine = Parameters.dDepthToMachine - - -- parametri opzionali - OptionalParameters = OptionalParameters or {} - 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 - if not IsFaceZOutOfRange( Face.vtN, Tool) then - - local CheckCollisionParameters = { - Edge = Edge, - vtNFace = Face.vtN, - vtHead = Face.vtN, - Part = Part, - Tool = Tool, - dDepthToMachine = dDepthToMachine - } - local CheckCollisionOptionalParameters = { - bIsDicing = bIsDicing - } - - local bCollisionFound, bMoveAfterSplit = PreSimulationLib.CheckCollision( sBladeEngagement, CheckCollisionParameters, CheckCollisionOptionalParameters) - - -- se nessuna collisione trovata si ritorna lavorazione fattibile, altrimenti si proseguirà al DownUp - if not bCollisionFound then - - return true, sBladeEngagement, bMoveAfterSplit, sLeadInOutType - end + if bIsEngagementOk then + + return true, 'Standard', bMoveAfterSplit end -- faccia non lavorabile in modo standard: si verifica se il DownUp è fattibile - sBladeEngagement = 'DownUp' + bIsEngagementOk, bMoveAfterSplit = TestEngagement( 'DownUp', Parameters, OptionalParameters) - -- 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 - - local CheckCollisionParameters = { - Edge = Edge, - vtNFace = Face.vtN, - vtHead = -Face.vtN, - Part = Part, - Tool = Tool, - dDepthToMachine = dDepthToMachine - } - local CheckCollisionOptionalParameters = {} - - local bCollisionFound, bMoveAfterSplit = PreSimulationLib.CheckCollision( sBladeEngagement, CheckCollisionParameters, CheckCollisionOptionalParameters) - - -- se nessuna collisione il DownUp è fattibile - if not bCollisionFound then - - return true, sBladeEngagement, bMoveAfterSplit, sLeadInOutType + if bIsEngagementOk then + + return true, 'DownUp', bMoveAfterSplit end return false diff --git a/LuaLibs/PreSimulationLib.lua b/LuaLibs/PreSimulationLib.lua index 02d8b25..e135661 100644 --- a/LuaLibs/PreSimulationLib.lua +++ b/LuaLibs/PreSimulationLib.lua @@ -224,11 +224,10 @@ function PreSimulationLib.CheckCollision( sBladeEngagement, Parameters, Optional -- 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 + OptionalParametersCheckCollisionWithAxis.MachiningPoints = OptionalParameters.MachiningPoints or nil -- asse Z si controlla sempre bCollisionFound, bMoveAfterSplitZ = PreSimulationLib.CheckCollisionWithAxis( 'Z', Parameters, OptionalParametersCheckCollisionWithAxis) diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index d4004a8..95967f1 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -100,10 +100,12 @@ local function CalculateLeadInOut( Machining, EdgeToMachine, bIsSplitFeature) if AreSameVectorApprox( Machining.vtToolDirection, EdgeToMachine.vtN) then LeadIn.dPerpDistance = EdgeToMachine.dElevation + BeamData.CUT_SIC - Machining.dRadialOffset LeadOut.dPerpDistance = EdgeToMachine.dElevation + BeamData.CUT_SIC - Machining.dRadialOffset + -- casi con lavorazione OppositeToolDirection else LeadIn.dPerpDistance = BeamData.CUT_SIC - Machining.dRadialOffset LeadOut.dPerpDistance = BeamData.CUT_SIC - Machining.dRadialOffset end + -- TODO conviene usare sempre EdgeToMachine.dElevation + BeamData.CUT_SIC - Machining.dRadialOffset?? tranne nei casi OppositeToolDirection else Machining.sLeadInOutType = GetLeadInOutType( Machining) if Machining.sLeadInOutType == 'Perpendicular' then