From e9417ba322cab64d78e713493b7ae481f5d55e04 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Wed, 17 Dec 2025 17:15:27 +0100 Subject: [PATCH] - in LeadInOutLib LeadIn e Out sono entrambi nella direzione del lato adiacente migliore --- LuaLibs/LeadInOutLib.lua | 82 +++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/LuaLibs/LeadInOutLib.lua b/LuaLibs/LeadInOutLib.lua index c3d4236..4ecd86c 100644 --- a/LuaLibs/LeadInOutLib.lua +++ b/LuaLibs/LeadInOutLib.lua @@ -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)