-- LeadInOutLib.lua by Egalware s.r.l. 2025/11/24 -- Libreria stima collisioni per travi -- Tabella per definizione modulo 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 if sLeadInOutType == 'Perpendicular' then -- informazioni lati adiacenti local nCurrentEdgeIndex = Edge.id + 1 local nPreviousEdgeIndex = ( nCurrentEdgeIndex == 1 and #Face.Edges) or nCurrentEdgeIndex - 1 local nNextEdgeIndex = ( nCurrentEdgeIndex == #Face.Edges and 1) or nCurrentEdgeIndex + 1 local EdgeNext = Face.Edges[nNextEdgeIndex] local EdgePrevious = Face.Edges[nPreviousEdgeIndex] -- 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) -- distanza dai punti di inizio e fine lavorazione reali al pezzo, nelle direzioni dei lati adiacenti -- TODO bisogna controllare bOk??? 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) -- 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, dDepthToMachine) * vtEdgeNextLoc: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) 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