Files
databeamnew/LuaLibs/LeadInOutLib.lua
T

136 lines
6.0 KiB
Lua

-- 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