diff --git a/LuaLibs/LeadInOutLib.lua b/LuaLibs/LeadInOutLib.lua index 4ecd86c..c9d4515 100644 --- a/LuaLibs/LeadInOutLib.lua +++ b/LuaLibs/LeadInOutLib.lua @@ -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