diff --git a/LuaLibs/ProcessScarfJoint.lua b/LuaLibs/ProcessScarfJoint.lua index 1b33c52..9654d21 100644 --- a/LuaLibs/ProcessScarfJoint.lua +++ b/LuaLibs/ProcessScarfJoint.lua @@ -196,28 +196,47 @@ local function ApplyDiceCut( vFaceOrd, nGoodFace1, nGoodFace4, nAddGrpId, b3Soli end end - local dDiceFaceMaxH = 0 - local dDiceFaceMinH = GEO.INFINITO + -- controllo per eseguire solo un taglio ottimizzato + local bExecJustOneCut = false + local dDiceFaceDim = GEO.INFINITO if ( i % 2) == 0 then for cont = 1, #vCuts[i] do local _, dDiceFaceH, dDiceFaceV = BL.GetFaceHvRefDim( vCuts[i][cont], 0) - dDiceFaceMaxH = max( dDiceFaceMaxH, dDiceFaceH) - -- calcolo lato orizzontale minore ipotizzando sia un trapezio - local dDiceFaceH2 = ( 2 * EgtSurfArea( vCuts[i][cont]) ) / dDiceFaceV - dDiceFaceH - dDiceFaceMinH = min( dDiceFaceMinH, dDiceFaceH2) + -- se feature verso Z, si ammette anche lavorazione in doppio + if AreSameVectorApprox( vtRef, Z_AX()) then + if dMaxDepth * 2 > dDiceFaceH + BD.CUT_EXTRA then + bExecJustOneCut = true + dDiceFaceDim = dDiceFaceH + break + end + elseif AreSameVectorApprox( vtRef, Y_AX()) or AreSameVectorApprox( vtRef, -Y_AX()) then + if dMaxDepth > dDiceFaceV + BD.CUT_EXTRA then + bExecJustOneCut = true + dDiceFaceDim = dDiceFaceV + break + end + end end end -- se si può fare, faccio unico taglio parallelo - if ( i % 2) == 0 and ( dMaxDepth > dDiceFaceMaxH - 0.5 * dDiceFaceMinH + BD.CUT_EXTRA_MIN) then + if bExecJustOneCut then local bDoubleCut = false local dCutExtra = BD.CUT_EXTRA - if dMaxDepth < dDiceFaceMaxH + BD.CUT_EXTRA then + if dMaxDepth < dDiceFaceDim then bDoubleCut = true - dCutExtra = - 0.5 * dDiceFaceMinH + BD.CUT_EXTRA_MIN end local nSurfToCut = EgtSurfTmBySewing( nAddGrpId, vCuts[i], false) - local nFaceUseCut1, nFaceUseCut2 = MCH_MILL_FU.ORTHO_BACK, MCH_MILL_FU.ORTHO_FRONT - if Proc.Tail then + + local nFaceUseCut1, nFaceUseCut2 + -- se feature rivolta verso alto setto direzione taglio davanti e dietro + if AreSameVectorApprox( vtRef, Z_AX()) then + nFaceUseCut1, nFaceUseCut2 = MCH_MILL_FU.ORTHO_BACK, MCH_MILL_FU.ORTHO_FRONT + -- altrimenti taglio da sopra + else + nFaceUseCut2 = MCH_MILL_FU.ORTHO_DOWN + end + + if Proc.Tail and AreSameVectorApprox( vtRef, Z_AX()) then nFaceUseCut1, nFaceUseCut2 = nFaceUseCut2, nFaceUseCut1 end if bDoubleCut then