- in LeadInOutLib LeadIn e Out sono entrambi nella direzione del lato adiacente migliore

This commit is contained in:
luca.mazzoleni
2025-12-17 17:15:27 +01:00
parent 79417998a2
commit e9417ba322
+44 -38
View File
@@ -46,6 +46,23 @@ function LeadInOutLib.CalculateLeadInOut( sLeadInOutType, Parameters)
LeadOut.dCompLength = 0
if sLeadInOutType == 'Perpendicular' then
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
-- informazioni lati adiacenti
local nCurrentEdgeIndex = Edge.id + 1
local nPreviousEdgeIndex = ( nCurrentEdgeIndex == 1 and #Face.Edges) or nCurrentEdgeIndex - 1
@@ -56,56 +73,45 @@ 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)
-- direzione lati adiacenti nel frame solidale al lato di lavoro
local vtEdgeNextLoc = Vector3d( EdgeNext.vtEdge)
vtEdgeNextLoc:toLoc( frEdge)
local vtEdgePreviousInvLoc = Vector3d( -EdgePrevious.vtEdge)
vtEdgePreviousInvLoc:toLoc( frEdge)
-- profondità di lavoro proiettata sui lati adiacenti
local dDepthToMachinePrevious = dDepthToMachine / abs( vtEdgePreviousInvLoc:getY())
local dDepthToMachineNext = dDepthToMachine / abs( vtEdgeNextLoc:getY())
-- punti di inizio e fine lavorazione alla profondità di lavoro reale
local ptStartAtDepth = Edge.ptStart + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
local ptEndAtDepth = Edge.ptEnd + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
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
local dCosAngleStart = -EdgePrevious.vtEdge * Edge.vtN
local dCosAngleEnd = EdgeNext.vtEdge * Edge.vtN
local vtLeadInOut
if dCosAngleStart > dCosAngleEnd then
vtLeadInOut = Vector3d( -EdgePrevious.vtEdge)
else
vtLeadInOut = Vector3d( EdgeNext.vtEdge)
end
-- direzione nel frame solidale al lato di lavoro
local vtLeadInOuttLoc = Vector3d( vtLeadInOut)
vtLeadInOuttLoc:toLoc( frEdge)
-- distanza dai punti di inizio e fine lavorazione reali al pezzo, nelle direzioni dei lati adiacenti
-- TODO bisogna controllare bOk???
-- 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( BeamData.CUT_SIC)
local bOkStart, IntersectionTypeStart, PartDistanceStart = EgtLineBoxInters( ptStartAtDepth, -EdgePrevious.vtEdge, b3BoxPartExpanded)
local bOkEnd, IntersectionTypeEnd, PartDistanceEnd = EgtLineBoxInters( ptEndAtDepth, EdgeNext.vtEdge, b3BoxPartExpanded)
local dDistanceToPartStart = #IntersectionTypeStart > 0 and PartDistanceStart[#PartDistanceStart] or ( dDepthToMachinePrevious + BeamData.COLL_SIC)
local dDistanceToPartEnd = #IntersectionTypeEnd > 0 and PartDistanceEnd[#PartDistanceEnd] or ( dDepthToMachineNext + BeamData.COLL_SIC)
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
-- componenti dell'attacco con aggiunta la sicurezza
LeadIn.dPerpDistance = max( dDistanceToPartStart * vtEdgePreviousInvLoc:getY(), dDepthToMachine)
LeadIn.dTangentDistance = max( dDistanceToPartStart, dDepthToMachinePrevious) * -abs( vtEdgePreviousInvLoc:getX())
LeadOut.dPerpDistance = max( dDistanceToPartEnd * vtEdgeNextLoc:getY(), dDepthToMachine)
LeadOut.dTangentDistance = max( dDistanceToPartEnd, dDepthToMachineNext) * vtEdgeNextLoc:getX()
LeadIn.dPerpDistance = dDistanceToPartStart * vtLeadInOuttLoc:getY()
LeadIn.dTangentDistance = dDistanceToPartStart * -vtLeadInOuttLoc:getX()
LeadOut.dPerpDistance = dDistanceToPartEnd * vtLeadInOuttLoc:getY()
LeadOut.dTangentDistance = dDistanceToPartEnd * vtLeadInOuttLoc:getX()
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)