- nei tagli di lama implementata gestione attacchi creati da Engagement

This commit is contained in:
luca.mazzoleni
2025-12-12 18:27:58 +01:00
parent 5068d75362
commit ef155ad1fb
5 changed files with 127 additions and 123 deletions
+50 -116
View File
@@ -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