- in LeadInOutLib si usano le funzioni Tool Collision Avoidance per calcolare i LeadIn / Out per gli attacchi lama

This commit is contained in:
luca.mazzoleni
2025-12-17 18:44:18 +01:00
parent e9417ba322
commit e9493ead6b
+44 -19
View File
@@ -10,6 +10,30 @@ local BeamData = require( 'BeamDataNew')
EgtOutLog( ' LeadInOutLib started', 1)
-------------------------------------------------------------------------------------------------------------
function CalculateLeadInOutLength( ptToolCenter, vtNFace, b3Box, vtLeadInOut, Tool)
-- al momento gestita solo lama
if not Tool.sFamily == 'SawBlade' then
error(' Tool family not implemented')
end
-- Box del pezzo espansi ortogonalmente alle tre direzioni canoniche X, Y e Z
local b3BoxX = BBox3d( b3Box) ; b3BoxX:expand( 0, 1000, 1000)
local b3BoxY = BBox3d( b3Box) ; b3BoxY:expand( 1000, 0, 1000)
local b3BoxZ = BBox3d( b3Box) ; b3BoxZ:expand( 1000, 1000, 0)
-- si setta utensile lama per il controllo collisione
EgtCAvSetSawTool( Tool.dThickness, Tool.dDiameter, Tool.dThickness, 0, 0)
-- calcolo distanza di cui retrarre con funzioni Tool Collision Avoidance
local dLength = min( EgtCAvToolPosBox( ptToolCenter + Tool.dThickness * vtNFace, vtNFace, b3BoxX, vtLeadInOut),
EgtCAvToolPosBox( ptToolCenter + Tool.dThickness * vtNFace, vtNFace, b3BoxY, vtLeadInOut),
EgtCAvToolPosBox( ptToolCenter + Tool.dThickness * vtNFace, vtNFace, b3BoxZ, vtLeadInOut))
return dLength
end
-------------------------------------------------------------------------------------------------------------
function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters)
@@ -73,11 +97,7 @@ function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters)
-- frame solidale al lato di lavoro (X lungo il lato, Y normale al lato)
local frEdge = Frame3d( Edge.ptStart, Face.vtN, Edge.vtEdge)
-- punti di inizio e fine lavorazione alla profondità di lavoro reale
local ptStartAtDepth = Edge.ptStart + Edge.vtN * ( Edge.dElevation - dDepthToMachine) + -Edge.vtEdge * LeadIn.dStartAddLength
local ptEndAtDepth = Edge.ptEnd + Edge.vtN * ( Edge.dElevation - dDepthToMachine) + Edge.vtEdge * LeadOut.dEndAddLength
-- tra le direzioni dei due lati adiacenti, si sceglie la migliore da cui attaccare, ossia quella più vicina alla perpendicolare al lato
-- tra le direzioni dei due lati adiacenti, si sceglie la migliore da cui attaccare, ossia quella più vicina alla perpendicolare al lato di lavoro
local dCosAngleStart = -EdgePrevious.vtEdge * Edge.vtN
local dCosAngleEnd = EdgeNext.vtEdge * Edge.vtN
local vtLeadInOut
@@ -91,21 +111,26 @@ function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters)
local vtLeadInOuttLoc = Vector3d( vtLeadInOut)
vtLeadInOuttLoc:toLoc( frEdge)
-- distanza dai punti di inizio e fine lavorazione reali al pezzo, nelle direzioni dei lati adiacenti
-- il box si espande in tutte le direzioni per contemplare la sicurezza CUT_SIC (minimo 1 per non far fallire l'intersezione)
-- TODO bisogna controllare bOk??? IntersectionType??
local b3BoxPartExpanded = BBox3d( Part.b3Part)
b3BoxPartExpanded:expand( max( BeamData.CUT_SIC, 1))
local bOkStart, IntersectionTypeStart, PartDistanceStart = EgtLineBoxInters( ptStartAtDepth, vtLeadInOut, b3BoxPartExpanded)
local bOkEnd, IntersectionTypeEnd, PartDistanceEnd = EgtLineBoxInters( ptEndAtDepth, vtLeadInOut, b3BoxPartExpanded)
local dDistanceToPartStart = PartDistanceStart[#PartDistanceStart] or BeamData.CUT_SIC
local dDistanceToPartEnd = PartDistanceEnd[#PartDistanceEnd] or BeamData.CUT_SIC
-- punti di inizio e fine lavorazione alla profondità di lavoro reale, considerando allungamenti/accorciamenti
local ptStartAtDepth = Edge.ptStart - Edge.vtEdge * LeadIn.dStartAddLength + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
local ptEndAtDepth = Edge.ptEnd + Edge.vtEdge * LeadOut.dEndAddLength + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
-- componenti dell'attacco con aggiunta la sicurezza
LeadIn.dPerpDistance = dDistanceToPartStart * vtLeadInOuttLoc:getY()
LeadIn.dTangentDistance = dDistanceToPartStart * -vtLeadInOuttLoc:getX()
LeadOut.dPerpDistance = dDistanceToPartEnd * vtLeadInOuttLoc:getY()
LeadOut.dTangentDistance = dDistanceToPartEnd * vtLeadInOuttLoc:getX()
-- punti in centro lama
local ptStartBladeCenter = ptStartAtDepth + Edge.vtN * Tool.dDiameter / 2
local ptEndBladeCenter = ptEndAtDepth + Edge.vtN * Tool.dDiameter / 2
-- il box si espande in tutte le direzioni per contemplare la sicurezza CUT_SIC
local b3BoxPartExpanded = BBox3d( Part.b3Part) ; b3BoxPartExpanded:expand( BeamData.CUT_SIC)
-- calcolo distanza per uscire dal box con questa lama
local dLeadInLength = CalculateLeadInOutLength( ptStartBladeCenter, Face.vtN, b3BoxPartExpanded, vtLeadInOut, Tool)
local dLeadOutLength = CalculateLeadInOutLength( ptEndBladeCenter, Face.vtN, b3BoxPartExpanded, vtLeadInOut, Tool)
-- componenti dell'attacco
LeadIn.dPerpDistance = dLeadInLength * vtLeadInOuttLoc:getY()
LeadIn.dTangentDistance = dLeadInLength * -vtLeadInOuttLoc:getX()
LeadOut.dPerpDistance = dLeadOutLength * vtLeadInOuttLoc:getY()
LeadOut.dTangentDistance = dLeadOutLength * vtLeadInOuttLoc:getX()
elseif sLeadInOutType == 'Tangent' then
LeadIn.dTangentDistance = Tool.dDiameter / 2 + BeamData.CUT_SIC