From f5a5350e706753b6473a4634040393cba939b57a Mon Sep 17 00:00:00 2001 From: "daniele.nicoli" Date: Tue, 16 Jun 2026 08:16:04 +0200 Subject: [PATCH] =?UTF-8?q?ProcessCut=20-=20Aggiunti=20tagli=20verticali?= =?UTF-8?q?=20anche=20in=20caso=20di=20tagli=20inclinati=20su=20testa=20o?= =?UTF-8?q?=20coda=20per=20rendere=20pi=C3=B9=20piccoli=20i=20pezzi=20che?= =?UTF-8?q?=20possono=20cadere=20sul=20motore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/FacesBySaw.lua | 12 +++--------- LuaLibs/ProcessCut.lua | 32 ++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/LuaLibs/FacesBySaw.lua b/LuaLibs/FacesBySaw.lua index 0a51d12..3f3f54f 100644 --- a/LuaLibs/FacesBySaw.lua +++ b/LuaLibs/FacesBySaw.lua @@ -237,14 +237,14 @@ local function GetEdgeToMachineFromVector( nSurfId, nFacet, vtOrthO) end --------------------------------------------------------------------- -function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth, bSpecialTangentLeadInOut, sLeadInOutType, Par5Alternative, dActualElevation, bForceClimbCut, bTiltedFaceAddVerticalDiceing) +function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth, bSpecialTangentLeadInOut, sLeadInOutType, Par5Alternative, dActualElevation, bForceClimbCut) -- se lama con asse parallelo alla faccia, passo alla apposita funzione if ( Par5 == MCH_MILL_FU.PARAL_DOWN or Par5 == MCH_MILL_FU.PARAL_TOP or Par5 == MCH_MILL_FU.PARAL_FRONT or Par5 == MCH_MILL_FU.PARAL_BACK or Par5 == MCH_MILL_FU.PARAL_LEFT or - Par5 == MCH_MILL_FU.PARAL_RIGHT) and not bTiltedFaceAddVerticalDiceing then + Par5 == MCH_MILL_FU.PARAL_RIGHT) then return MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, sLeadInOutType, dActualElevation) end -- la lama ha asse perpendicolare alla faccia @@ -383,7 +383,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw end local nFaceUse = nOrthoOpposite if bDownUp then nFaceUse = BL.GetOrtupOpposite( nOrthoOpposite) end - local bWsRight = ( bInvert ~= bDownUp) or bTiltedFaceAddVerticalDiceing + local bWsRight = ( bInvert ~= bDownUp) local nWorkSide = EgtIf( bWsRight, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT) -- Versore di riferimento local vtRef = Vector3d( vtTg) @@ -542,12 +542,6 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw -- 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 BD.C_SIMM and bTiltedFaceAddVerticalDiceing and abs( vtAux:getY()) > abs( vtAux:getX()) - GEO.EPS_SMALL and AreSameOrOppositeVectorApprox( vtTg, Z_AX()) then - if vtN:getX() > 10 * GEO.EPS_SMALL then - nSCC = MCH_SCC.ADIR_YP - else - nSCC = MCH_SCC.ADIR_YM - end elseif abs( vtAux:getX()) > abs( vtAux: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 diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index 4725f60..8f0d645 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -556,17 +556,19 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b end local bOk2, sErr2 = Fbs.MakeOne( nSurfToCut, 0, sCutting, dSawDiam, nFaceUseCut2, nil, dCutExtra, BD.CUT_SIC, 0, 0, 0, '', b3Raw) if not bOk2 then return false, sErr2 end - + -- caso standard else - if ( i % 2) == 0 and Proc.Fct == 1 and ( AreSameVectorApprox( vtO, Z_AX()) or AreSameVectorApprox( vtO, -Z_AX())) then + if ( i % 2) == 0 and Proc.Fct == 1 and AreSameOrOppositeVectorApprox( vtO, Z_AX()) then local vtOrthoVert = vtN ^ vtO + if ( vtN:getY() > 0 and vtOrthoVert:getY() > 0) or ( vtN:getY() < 0 and vtOrthoVert:getY() < 0) then + vtOrthoVert = -vtOrthoVert + end local Frame = Frame3d( ptC, vtN, vtO) local b3Fac = EgtGetBBoxRef( vCuts[i][1], GDB_BB.STANDARD, Frame) if abs( b3Fac:getDimY() - BD.MAX_DIM_DICE) > 10 * GEO.EPS_SMALL then - local bTiltedFaceAddVerticalDiceing = EgtGetInfo( Proc.Id, 'Q19', 'i') == 1 local nVerticalCuts = ceil( b3Fac:getDimY() / ( BD.MAX_LEN_DICE)) - 1 - local dVerticalSliceHeight = b3Fac:getDimY() / ( nVerticalCuts + 1) + local dVerticalSliceDist = b3Fac:getDimY() / ( nVerticalCuts + 1) local dSawDiam = 400 if EgtMdbSetCurrMachining( sCutting) then local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) @@ -574,12 +576,22 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam end end - -- tagli orizzontali - for k = nVerticalCuts, 1, -1 do - local nFaceUse = BL.GetNearestParalOpposite( vtN) - local dVerticalCutOffset = dVerticalSliceHeight * -k - local sLeadInOutType = 'PerpendicularOutraw' - local bOk, sErr = Fbs.MakeOne( vCuts[i][1], 0, sCutting, dSawDiam, nFaceUse, nil, -0.1, BD.CUT_SIC, dVerticalCutOffset, 0, 0, '', b3Raw, nil, nil, nil, sLeadInOutType, nil, 0, nil, bTiltedFaceAddVerticalDiceing) + -- tagli verticali + for k = 1, nVerticalCuts do + local nFaceUse = BL.GetNearestOrthoOpposite( vtN) + local dVerticalCutOffset = dVerticalSliceDist * k + local sLeadInOutType = 'Perpendicular' + local nMergedParallelSurfId = EgtSurfTmBySewing( nAddGrpId, vCuts[i], false) + local ptVertCut = EgtSurfTmFacetCenter( nMergedParallelSurfId, 0, GDB_ID.ROOT) + ptVertCut = ptVertCut + ( -b3Fac:getDimY()/2 + dVerticalCutOffset) * vtOrthoVert + local nSurfId = EgtSurfTmPlaneInBBox( nAddGrpId, ptVertCut, vtOrthoVert, b3Raw, GDB_RT.GLOB) + if i ~= 2 then + local nMergedPreviousParallelSurfId = EgtSurfTmBySewing( nAddGrpId, vCuts[i-2], false) + local ptOnPreviousParallelSurf = EgtSurfTmFacetCenter( nMergedPreviousParallelSurfId, 0, GDB_ID.ROOT) + EgtCutSurfTmPlane( nSurfId, ptOnPreviousParallelSurf, vtN, false, GDB_RT.GLOB) + end + EgtCutSurfTmPlane( nSurfId, ptVertCut, -vtN, false, GDB_RT.GLOB) + local bOk, sErr = Fbs.MakeOne( nSurfId, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1, BD.CUT_SIC, 0, 0, 0, '', b3Raw, nil, nil, nil, sLeadInOutType, nil, 0, nil) if not bOk then return bOk, sErr end end end