diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index 65b2ba2..4d4f4aa 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -59,6 +59,7 @@ _G.package.loaded.Identity = nil _G.package.loaded.Logs = nil _G.package.loaded.MachiningLib = nil _G.package.loaded.PreSimulationLib = nil +_G.package.loaded.LeadInOutLib = nil -- strategie di base sempre presenti _G.package.loaded['HEADCUT\\HEADCUT'] = nil _G.package.loaded['TAILCUT\\TAILCUT'] = nil diff --git a/LuaLibs/LeadInOutLib.lua b/LuaLibs/LeadInOutLib.lua index fdd0a08..7e4c810 100644 --- a/LuaLibs/LeadInOutLib.lua +++ b/LuaLibs/LeadInOutLib.lua @@ -6,27 +6,95 @@ local LeadInOutLib = {} -- Include require( 'EgtBase') +local BeamData = require( 'BeamDataNew') EgtOutLog( ' LeadInOutLib started', 1) ------------------------------------------------------------------------------------------------------------- +function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters) + -- parametri obbligatori + local Face = Parameters.Face + local Edge = Parameters.Edge + local Part = Parameters.Part + local Tool = Parameters.Tool + local dDepthToMachine = Parameters.dDepthToMachine + local LeadInOut = {} + local bIsStartClosed = not Edge.bIsStartOpen + local bIsEndClosed = not Edge.bIsEndOpen + -- accorciamento per lati chiusi (è sempre l'impronta utensile) + LeadInOut.dToolMarkLength = sqrt( dDepthToMachine * Tool.dDiameter - dDepthToMachine * dDepthToMachine) + -- allungamento per faccia singola (aperta in tutte le direzioni) + LeadInOut.dAddedLengthOpenFace = BeamData.CUT_EXTRA + local LeadIn = {} + local LeadOut = {} + LeadIn.dStartAddLength = 0 + LeadOut.dEndAddLength = 0 + LeadIn.nType = MCH_MILL_LI.LINEAR + LeadOut.nType = MCH_MILL_LI.LINEAR + LeadIn.dPerpDistance = 0 + LeadOut.dPerpDistance = 0 + LeadIn.dTangentDistance = 0 + LeadOut.dTangentDistance = 0 + LeadIn.dElevation = 0 + LeadOut.dElevation = 0 + LeadIn.dCompLength = 0 + LeadOut.dCompLength = 0 + -- TODO qui calcolo con EgtLineBoxInters + if sLeadInOutType == 'Perpendicular' then + LeadIn.dPerpDistance = dDepthToMachine + BeamData.CUT_SIC + LeadOut.dPerpDistance = dDepthToMachine + BeamData.CUT_SIC + elseif sLeadInOutType == 'Tangent' then + LeadIn.dTangentDistance = Tool.dDiameter / 2 + BeamData.CUT_SIC + LeadOut.dTangentDistance = Tool.dDiameter / 2 + BeamData.CUT_SIC + end + if bIsStartClosed and bIsEndClosed then + LeadIn.dStartAddLength = -LeadInOut.dToolMarkLength + LeadOut.dEndAddLength = -LeadInOut.dToolMarkLength + elseif bIsStartClosed then + LeadIn.dStartAddLength = -LeadInOut.dToolMarkLength + -- eventuale correzione per accorciamento maggiore di larghezza tasca + LeadOut.dEndAddLength = max( -LeadIn.dStartAddLength - Edge.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA) + elseif bIsEndClosed then + LeadOut.dEndAddLength = -LeadInOut.dToolMarkLength + -- eventuale correzione per accorciamento maggiore di larghezza tasca + LeadIn.dStartAddLength = max( -LeadOut.dEndAddLength - Edge.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA) + else + LeadIn.dStartAddLength = LeadInOut.dAddedLengthOpenFace + LeadOut.dEndAddLength = LeadInOut.dAddedLengthOpenFace + end + LeadIn.dTotalLength = sqrt( LeadIn.dPerpDistance ^ 2 + LeadIn.dTangentDistance ^ 2) + LeadOut.dTotalLength = sqrt( LeadOut.dPerpDistance ^ 2 + LeadOut.dTangentDistance ^ 2) + LeadInOut.dTotalLength = LeadIn.dTotalLength + LeadOut.dTotalLength + LeadInOut.LeadIn = LeadIn + LeadInOut.LeadOut = LeadOut + return LeadInOut +end +------------------------------------------------------------------------------------------------------------- +function LeadInOutLib.InvertLeadInOut( LeadIn, LeadOut) + local dOriginalStartAddLength = LeadIn.dStartAddLength + local dOriginalEndAddLength = LeadOut.dEndAddLength + LeadIn, LeadOut = LeadOut, LeadIn + LeadIn.dStartAddLength = dOriginalEndAddLength + LeadOut.dEndAddLength = dOriginalStartAddLength + LeadIn.dEndAddLength = nil + LeadOut.dStartAddLength = nil + return LeadIn, LeadOut +end - - - +------------------------------------------------------------------------------------------------------------- return LeadInOutLib \ No newline at end of file diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 9505d76..5063f28 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -334,7 +334,7 @@ local function TestEngagement( sBladeEngagement, Parameters, OptionalParameters) local LeadInOut = {} -- attacco perpendicolare - local PerpendicularLeadInOut = LeadInOutLib.CalculateLeadInOut() + local PerpendicularLeadInOut = LeadInOutLib.CalculateLeadInOut( 'Perpendicular', Parameters) local bOutOfStrokePerpendicular = PreSimulationLib.CheckOutOfStroke() -- TODO passare punti custom attacco perpendicolare -- se non è in finecorsa si aggiunge come attacco possibile if not bOutOfStrokePerpendicular then @@ -352,7 +352,7 @@ local function TestEngagement( sBladeEngagement, Parameters, OptionalParameters) end -- attacco tangenziale - local TangentLeadInOut = LeadInOutLib.CalculateLeadInOut() + local TangentLeadInOut = LeadInOutLib.CalculateLeadInOut( 'Tangent', Parameters) local bOutOfStrokeTangent = PreSimulationLib.CheckOutOfStroke() -- TODO passare punti custom attacco tangenziale -- attacco tangenziale non in finecorsa: si verifica se è in collisione if not bOutOfStrokeTangent then @@ -393,7 +393,7 @@ function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) local Engagement -- test lavorazione faccia in modo standard (no DownUp) - local bIsEngagementOk, bMoveAfterSplit = TestEngagement( 'Standard', Parameters, OptionalParameters) + local bIsEngagementOk, bMoveAfterSplit, LeadInOut = TestEngagement( 'Standard', Parameters, OptionalParameters) if bIsEngagementOk then @@ -406,7 +406,7 @@ function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) end -- faccia non lavorabile in modo standard: si verifica se il DownUp è fattibile - bIsEngagementOk, bMoveAfterSplit = TestEngagement( 'DownUp', Parameters, OptionalParameters) + bIsEngagementOk, bMoveAfterSplit, LeadInOut = TestEngagement( 'DownUp', Parameters, OptionalParameters) if bIsEngagementOk then diff --git a/Process.lua b/Process.lua index 02b1091..b4c9670 100644 --- a/Process.lua +++ b/Process.lua @@ -47,6 +47,7 @@ _G.package.loaded.Identity = nil _G.package.loaded.Logs = nil _G.package.loaded.MachiningLib = nil _G.package.loaded.PreSimulationLib = nil +_G.package.loaded.LeadInOutLib = nil -- strategie di base sempre presenti _G.package.loaded['HEADCUT\\HEADCUT'] = nil _G.package.loaded['TAILCUT\\TAILCUT'] = nil diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 09d711d..99ae72d 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -13,134 +13,58 @@ local LeadInOutLib = require( 'LeadInOutLib') local FACEBYBLADE = {} ------------------------------------------------------------------------------------------------------------- -local function GetLeadInOutType( Machining) - local sLeadInOutType = '' +-- i parametri si leggono da LeadInOut (engagement) e si modificano solo se necessario +local function GetLeadInOut( Machining, EdgeToMachine, bIsSplitFeature) - if Machining.bIsStartClosed or Machining.bIsEndClosed - or Machining.sEdgeUsage == 'Guillotine' - or Machining.sEdgeUsage == 'Reduced' then - - sLeadInOutType = 'Perpendicular' - else - -- testa sopra - if TOOLS[Machining.nToolIndex].SetupInfo.HeadType.bTop then - if abs( Machining.vtToolDirection:getX()) < 0.7 then - if Machining.vtToolDirection:getZ() > -0.087 - or ( abs( Machining.vtToolDirection:getX()) < 0.34202 and abs( Machining.vtToolDirection:getZ()) < 0.7) then - sLeadInOutType = 'Perpendicular' - else - sLeadInOutType = 'Tangent' - end - elseif abs( Machining.vtEdgeDirection:getZ()) > 0.7 then - sLeadInOutType = 'Perpendicular' - else - -- TODO qui attacco tangenziale speciale tutto da un lato - sLeadInOutType = 'Tangent' - end - -- testa sotto - elseif TOOLS[Machining.nToolIndex].SetupInfo.HeadType.bBottom then - if abs( Machining.vtToolDirection:getX()) < 0.7 then - if Machining.vtToolDirection:getZ() < -GEO.EPS_SMALL - or ( abs( Machining.vtToolDirection:getX()) < 0.34202 and abs( Machining.vtToolDirection:getZ()) < 0.7) then - sLeadInOutType = 'Perpendicular' - else - sLeadInOutType = 'Tangent' - end - elseif abs( Machining.vtEdgeDirection:getZ()) > 0.7 then - sLeadInOutType = 'Perpendicular' - else - -- TODO qui attacco tangenziale speciale tutto da un lato - sLeadInOutType = 'Tangent' - end - -- se testa senza preferenza Top e Bottom si fa sempre attacco tangenziale - else - sLeadInOutType = 'Tangent' - end - end + local LeadIn + local LeadOut - return sLeadInOutType -end - - -local function CalculateLeadInOut( Machining, EdgeToMachine, bIsSplitFeature) - -- TODO implementare le funzioni di Tool Collision Avoidance (vedi wiki e FacesBysaw -> CalcLeadInOutPerpGeom) - - -- accorciamento per lati chiusi (è sempre l'impronta utensile) - local dToolMarkLength = sqrt( Machining.dDepthToMachine * TOOLS[Machining.nToolIndex].dDiameter - Machining.dDepthToMachine * Machining.dDepthToMachine) - -- allungamento per faccia singola (aperta in tutte le direzioni) - local dAddedLengthOpenFace = BeamData.CUT_EXTRA - if Machining.sEdgeUsage == 'Guillotine' then - local dGuillotineLengthToMachine = 1 - dAddedLengthOpenFace = ( - EdgeToMachine.dLength + dGuillotineLengthToMachine) / 2 - elseif Machining.sEdgeUsage == 'Reduced' then - dAddedLengthOpenFace = - FACEBYBLADE.GetPathReductionLength( Machining.nToolIndex, Machining.dMaxRadialOffset) - end - - if Machining.bInvert then - Machining.bIsStartClosed, Machining.bIsEndClosed = Machining.bIsEndClosed, Machining.bIsStartClosed - end - - local LeadIn = {} - local LeadOut = {} - LeadIn.dStartAddLength = 0 - LeadOut.dEndAddLength = 0 - - - -- TODO questa parte va letta da Engagement - Machining.sLeadInOutType = '' - LeadIn.nType = MCH_MILL_LI.LINEAR - LeadOut.nType = MCH_MILL_LI.LINEAR - LeadIn.dPerpDistance = 0 - LeadOut.dPerpDistance = 0 - LeadIn.dTangentDistance = 0 - LeadOut.dTangentDistance = 0 - - -- TODO qua deve arrivare dal BladeEngagement e cambiare solamente se step > 1 + -- in certe condizioni si deve forzare attacco perpendicolare if Machining.bIsStartClosed or Machining.bIsEndClosed or Machining.CloneStepsRadial.nCount > 1 or Machining.Steps.nCount > 1 or bIsSplitFeature then - - Machining.sLeadInOutType = 'Perpendicular' - 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 + + if Machining.LeadInOut.Perpendicular then + + Machining.sLeadInOutType = 'Perpendicular' + + -- se attacco perpendicolare richiesto ma non disponibile, la lavorazione non è fattibile else - LeadIn.dPerpDistance = BeamData.CUT_SIC - Machining.dRadialOffset - LeadOut.dPerpDistance = BeamData.CUT_SIC - Machining.dRadialOffset + + return end - else - Machining.sLeadInOutType = 'Tangent' - LeadIn.dTangentDistance = TOOLS[Machining.nToolIndex].dDiameter / 2 + BeamData.CUT_SIC - LeadOut.dTangentDistance = TOOLS[Machining.nToolIndex].dDiameter / 2 + BeamData.CUT_SIC + + Machining.sLeadInOutType = Machining.LeadInOut.sChosen end - LeadIn.dElevation = 0 - LeadOut.dElevation = 0 - LeadIn.dCompLength = 0 - LeadOut.dCompLength = 0 + -- si prendono i valori che arrivano da LeadInOut (engagement) + LeadIn = BeamLib.TableCopyDeep( Machining.LeadInOut[Machining.LeadInOut.sChosen].LeadIn) + LeadOut = BeamLib.TableCopyDeep( Machining.LeadInOut[Machining.LeadInOut.sChosen].LeadOut) - -- TODO fine parte letta da Engagement - - - if Machining.bIsStartClosed and Machining.bIsEndClosed then - LeadIn.dStartAddLength = -dToolMarkLength - LeadOut.dEndAddLength = -dToolMarkLength - elseif Machining.bIsStartClosed then - LeadIn.dStartAddLength = -dToolMarkLength - -- eventuale correzione per accorciamento maggiore di larghezza tasca - LeadOut.dEndAddLength = max( -LeadIn.dStartAddLength - EdgeToMachine.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA) - elseif Machining.bIsEndClosed then - LeadOut.dEndAddLength = -dToolMarkLength - -- eventuale correzione per accorciamento maggiore di larghezza tasca - LeadIn.dStartAddLength = max( -LeadOut.dEndAddLength - EdgeToMachine.dLength + 10 * BeamData.CUT_EXTRA, BeamData.CUT_EXTRA) - else - LeadIn.dStartAddLength = dAddedLengthOpenFace - LeadOut.dEndAddLength = dAddedLengthOpenFace + -- se senso di percorrenza invertito si invertono anche gli attacchi + if Machining.bInvert then + LeadIn, LeadOut = LeadInOutLib.InvertLeadInOut( LeadIn, LeadOut) end + + -- se lavorazione con OppositeToolDirection l'attacco va corretto + if not AreSameVectorApprox( Machining.vtToolDirection, EdgeToMachine.vtN) then + LeadIn.dPerpDistance = BeamData.CUT_SIC - Machining.dRadialOffset + LeadOut.dPerpDistance = BeamData.CUT_SIC - Machining.dRadialOffset + end + + -- in caso di percorso ridotto gli attacchi vanno adeguati + if Machining.sEdgeUsage == 'Guillotine' then + local dGuillotineLengthToMachine = 1 + LeadIn.dStartAddLength = ( - EdgeToMachine.dLength + dGuillotineLengthToMachine) / 2 + LeadOut.dEndAddLength = ( - EdgeToMachine.dLength + dGuillotineLengthToMachine) / 2 + elseif Machining.sEdgeUsage == 'Reduced' then + LeadIn.dStartAddLength = - FACEBYBLADE.GetPathReductionLength( Machining.nToolIndex, Machining.dMaxRadialOffset) + LeadOut.dEndAddLength = - FACEBYBLADE.GetPathReductionLength( Machining.nToolIndex, Machining.dMaxRadialOffset) + end + -- stima lunghezza reale attacchi per calcolo lunghezza lavorata local dEstimatedLeadInPerpDistance = 0 local dEstimatedLeadInTangentDistance = 0 @@ -293,6 +217,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar if Cutting.bIsApplicable then Cutting.sBladeEngagement = Engagement.sBladeEngagement Cutting.bMoveAfterSplit = Engagement.bMoveAfterSplit + Cutting.LeadInOut = Engagement.LeadInOut end -- utensile da cercare: si prende la lama migliore che può effettuare questo taglio, senza particolari analisi @@ -311,6 +236,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar if Cutting.nToolIndex then Cutting.sBladeEngagement = ToolInfo.Engagement.sBladeEngagement Cutting.bMoveAfterSplit = ToolInfo.Engagement.bMoveAfterSplit + Cutting.LeadInOut = Engagement.LeadInOut end -- se non trovato utensile, la lavorazione non è applicabile @@ -567,7 +493,13 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar end -- approccio e retrazione - Cutting.LeadIn, Cutting.LeadOut = CalculateLeadInOut( Cutting, EdgeToMachine, bIsSplitFeature) + Cutting.LeadIn, Cutting.LeadOut = GetLeadInOut( Cutting, EdgeToMachine, bIsSplitFeature) + -- se il calcolo attacchi fallisce, la lavorazione non è fattibile + if not Cutting.LeadIn or not Cutting.LeadOut then + + Cutting.bIsApplicable = false + return Cutting + end -- lunghezza lavorata -- TODO per il calcolo del dLengthOnX si deve correggere con allungamento / accorciamento percorso @@ -576,6 +508,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar Cutting.dLengthOnX = b3BoxEdge:getDimX() Cutting.dTimeToMachine, Cutting.dLengthToMachineAllStepsWithLeadInOut = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Cutting, Part) -- lunghezza impronta lama + -- TODO rimpiazzare con LeadInOut.dToolMarkLength if Cutting.bIsStartClosed and Cutting.bIsEndClosed then Cutting.dToolMarkLength = abs( min( Cutting.LeadIn.dStartAddLength, Cutting.LeadOut.dEndAddLength)) elseif Cutting.bIsStartClosed then @@ -594,7 +527,8 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar -- se lavorazione aperta sulla coda, eventuali aggiustamenti -- TODO valutare se fare funzione a parte - local bIsTruncatingCutOnTail = Proc.Topology and ( Proc.Topology.sName == 'Cut-1-Through' or Proc.Topology.sName == 'TailCut') and Proc.AffectedFaces.bLeft + Cutting.bMoveAfterSplit = Cutting.bMoveAfterSplit or Cutting.LeadIn.bMoveAfterSplit or Cutting.LeadOut.bMoveAfterSplit + local bIsTruncatingCutOnTail = Proc.Topology and ( Proc.Topology.sName == 'Cut-1-Through' or Proc.Topology.sName == 'TailCut') and Proc.AffectedFaces.bLeft if Cutting.bMoveAfterSplit or bIsTruncatingCutOnTail then Cutting.sStage = 'AfterTail' elseif Proc.AffectedFaces.bLeft and ( EdgeToMachine.sType == 'Bottom' or ( Cutting.vtToolDirection:getX() < 0.707)) then