From d2eebfeb61b20192f43304ce37889b7de274f602 Mon Sep 17 00:00:00 2001 From: "daniele.nicoli" Date: Fri, 24 Jul 2026 10:06:20 +0200 Subject: [PATCH] LapJoint - Slot - Calcolo leadin/out tornato allo stato della 3.1f3 per problemi con altri casi. Modificato calcolo SCC come da FaceBySaw. --- LuaLibs/ProcessLapJoint.lua | 86 ++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 48 deletions(-) diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index c9ca02a..4b258e7 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -5713,17 +5713,8 @@ function SawPlusChain.CalculateLeadInOut( Machining, EdgeToMachine, FaceToMachin LeadIn.StartAddLength = BD.CUT_EXTRA LeadOut.EndAddLength = BD.CUT_EXTRA end - local vtN = Vector3d( FaceToMachine.VtN) - local vtOrthO - if EdgeToMachine.Elevation > - 10 * GEO.EPS_SMALL then - vtOrthO = Vector3d( EdgeToMachine.ToolDirection) - else - vtOrthO = -Vector3d( EdgeToMachine.ToolDirection) - end - local ptP1 = Point3d( FaceToMachine.Edges.BottomEdge.ptStart) - local ptP2 = Point3d( FaceToMachine.Edges.BottomEdge.ptEnd) - local vtV1 = -Vector3d( FaceToMachine.Edges.SideEdges.StartEdge.vtEdge) - local vtV2 = Vector3d( FaceToMachine.Edges.SideEdges.EndEdge.vtEdge) + local ptP1 = Point3d( EdgeToMachine.ptStart) + local ptP2 = Point3d( EdgeToMachine.ptEnd) local bInvert = Machining.Invert if bInvert then @@ -5734,16 +5725,6 @@ function SawPlusChain.CalculateLeadInOut( Machining, EdgeToMachine, FaceToMachin Machining.vtTg = vtTg Machining.vtV = vtV1 - -- Versore di riferimento - local vtRef = Vector3d( vtTg) - vtRef:rotate( vtN, EgtIf( bInvert, -90, 90)) - - local b3Box = BBox3d( b3Raw) - b3Box:expand( BD.CUT_SIC) - local ptPa1 = ptP1 + LeadIn.StartAddLength * -vtTg - local ptPa2 = ptP2 + LeadOut.EndAddLength * vtTg - - LeadIn.TangentDistance, LeadIn.PerpDistance, LeadOut.TangentDistance, LeadOut.PerpDistance = Fbs.CalcLeadInOutPerpGeom( ptPa1, ptPa2, vtV1, vtV2, vtN, ( Machining.Tool.Diameter / 2), vtRef, -Machining.RadialOffset, b3Box) else if Machining.IsStartClosed then LeadIn.StartAddLength = -dAddLengthToReduce @@ -5856,23 +5837,42 @@ function SawPlusChain.ApplyMachining( Machining, b3Raw) end -function SawPlusChain.Saw.GetSCC( vtMachiningDirection) +function SawPlusChain.Saw.GetSCC( vtMachiningDirection, vtN, vtTg) -- TODO implementare SCC come per FacesBySaw - local nSCC = MCH_SCC.NONE - if AreSameVectorApprox( vtMachiningDirection, Z_AX()) then - nSCC = MCH_SCC.ADIR_ZP - elseif AreOppositeVectorApprox( vtMachiningDirection, Z_AX()) then - nSCC = MCH_SCC.ADIR_ZM - elseif AreSameVectorApprox( vtMachiningDirection, Y_AX()) then - nSCC = MCH_SCC.ADIR_YP - elseif AreOppositeVectorApprox( vtMachiningDirection, Y_AX()) then - nSCC = MCH_SCC.ADIR_YM - elseif AreSameVectorApprox( vtMachiningDirection, X_AX()) then - nSCC = MCH_SCC.ADIR_XP - elseif AreOppositeVectorApprox( vtMachiningDirection, X_AX()) then - nSCC = MCH_SCC.ADIR_XM + if not BD.TURN then + -- per ora aggregato usato in verticale solo in split e headcut; Fast non influenzata + if BD.C_SIMM and bMaximizeVerticalDepth then + nSCC = MCH_SCC.ADIR_ZM + elseif abs( vtMachiningDirection:getX()) > abs( vtMachiningDirection:getY()) - GEO.EPS_SMALL then + -- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno + if abs( vtTg:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtN, Z_AX()) then + nSCC = EgtIf( ( vtMachiningDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) + else + nSCC = EgtIf( ( vtMachiningDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) + end + else + -- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno + if abs( vtTg:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtN, Z_AX()) then + nSCC = EgtIf( ( vtMachiningDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YM, MCH_SCC.ADIR_YP) + else + nSCC = EgtIf( ( vtMachiningDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) + end + end + else + if AreSameVectorApprox( vtMachiningDirection, Z_AX()) then + nSCC = MCH_SCC.ADIR_ZP + elseif AreOppositeVectorApprox( vtMachiningDirection, Z_AX()) then + nSCC = MCH_SCC.ADIR_ZM + elseif AreSameVectorApprox( vtMachiningDirection, Y_AX()) then + nSCC = MCH_SCC.ADIR_YP + elseif AreOppositeVectorApprox( vtMachiningDirection, Y_AX()) then + nSCC = MCH_SCC.ADIR_YM + elseif AreSameVectorApprox( vtMachiningDirection, X_AX()) then + nSCC = MCH_SCC.ADIR_XP + elseif AreOppositeVectorApprox( vtMachiningDirection, X_AX()) then + nSCC = MCH_SCC.ADIR_XM + end end - return nSCC end @@ -5994,8 +5994,6 @@ function SawPlusChain.Saw.CalculateMachiningParameters( Proc, FaceToMachine, Edg Cutting.Faceuse = BL.GetNearestOrthoOpposite( -EdgeToMachine.ToolDirection) end Cutting.nEdgeFaceUse = EdgeToMachine.Id - -- SCC - Cutting.SCC = SawPlusChain.Saw.GetSCC( EdgeToMachine.ToolDirection) -- asse bloccato Cutting.BlockedAxis = {} Cutting.BlockedAxis.Orientation = 'perpendicular' @@ -6003,6 +6001,8 @@ function SawPlusChain.Saw.CalculateMachiningParameters( Proc, FaceToMachine, Edg Cutting.BlockedAxis.VtOut = EgtIf( FaceToMachine.VtN:getX() > 0, X_AX(), -X_AX()) -- approccio e retrazione Cutting.LeadIn, Cutting.LeadOut = SawPlusChain.CalculateLeadInOut( Cutting, EdgeToMachine, FaceToMachine, b3Raw) + -- SCC + Cutting.SCC = SawPlusChain.Saw.GetSCC( EdgeToMachine.ToolDirection, FaceToMachine.VtN, Cutting.vtTg) -- eventuale step orizzontale Cutting.HorizontalSteps = {} if Cutting.Tool.SideStep then @@ -6036,25 +6036,15 @@ function SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw) local bIsCuttingOk = false local sCuttingOriginalMessage = Cutting.Message or '' local sCuttingApplyMessage = '' - local vtTg = Cutting.vtTg - local bInvert = Cutting.Invert local dOriginalRadialOffset = Cutting.RadialOffset local dOriginalLeadInPerpDistance = Cutting.LeadIn.PerpDistance - local dOriginalLeadInTangDistance = Cutting.LeadIn.TangentDistance local dOriginalLeadOutPerpDistance = Cutting.LeadOut.PerpDistance - local dOriginalLeadOutTangDistance = Cutting.LeadOut.TangentDistance for i = Cutting.HorizontalSteps.Count, 1, -1 do Cutting.RadialOffset = dOriginalRadialOffset + Cutting.HorizontalSteps.StepLength * ( i - 1) - local dOrthoOffsetStep = ( Cutting.RadialOffset * ( Cutting.vtV * vtTg)) -- update distanza perpendicolare attacco per contemplare l'offset applicato Cutting.LeadIn.PerpDistance = dOriginalLeadInPerpDistance - Cutting.RadialOffset - Cutting.LeadIn.TangentDistance = dOriginalLeadInTangDistance + dOrthoOffsetStep + Cutting.LeadIn.StartAddLength Cutting.LeadOut.PerpDistance = dOriginalLeadOutPerpDistance - Cutting.RadialOffset - Cutting.LeadOut.TangentDistance = dOriginalLeadOutTangDistance - dOrthoOffsetStep - Cutting.LeadOut.EndAddLength - - Cutting.LeadIn.StartAddLength = Cutting.LeadIn.StartAddLength - dOrthoOffsetStep - Cutting.LeadIn.StartAddLength - Cutting.LeadOut.EndAddLength = Cutting.LeadOut.EndAddLength + dOrthoOffsetStep + Cutting.LeadOut.EndAddLength -- applicazione lavorazione bIsCuttingOk, sCuttingApplyMessage = SawPlusChain.ApplyMachining( Cutting, b3Raw) -- update messaggi