diff --git a/LuaLibs/FacesBySaw.lua b/LuaLibs/FacesBySaw.lua index 662dddb..aec4327 100644 --- a/LuaLibs/FacesBySaw.lua +++ b/LuaLibs/FacesBySaw.lua @@ -18,6 +18,7 @@ -- 2023/05/18 Imposto in ogni caso dVzLimDwnUp prima anche di bDownHead. -- 2023/06/14 Aggiunta MakeParallelOne e tolti parametri nForceWorkSide, nForceSCC da MakeOne. -- 2023/09/26 Piccola modifica per Turn su bInvert di MakeOne. +-- 2023/10/24 In MakeOne migliorata gestione taglio con percorso bilinea. Aggiunta funzione GetNameSolidFaceIncludingLine. -- Tabella per definizione modulo local FacesBySaw = {} @@ -140,6 +141,31 @@ function MakeParallelOne( nSurfId, nFacet, sCutting, dSawDiam, nFaceUse, dVzLimD return true, sName, nMchFId end +--------------------------------------------------------------------- +local function GetNameSolidFaceIncludingLine( b3Solid, ptP1Comp, ptP2Comp) + -- se aperto su faccia fronte + if abs( b3Solid:getMin():getY() - ptP1Comp:getY()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMin():getY() - ptP2Comp:getY()) < 100 * GEO.EPS_SMALL then + return true, 'Front' + -- se aperto su faccia sopra + elseif abs( b3Solid:getMax():getY() - ptP1Comp:getY()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMax():getY() - ptP2Comp:getY()) < 100 * GEO.EPS_SMALL then + return true, 'Back' + -- se aperto su faccia retro + elseif abs( b3Solid:getMin():getZ() - ptP1Comp:getZ()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMin():getZ() - ptP2Comp:getZ()) < 100 * GEO.EPS_SMALL then + return true, 'Bottom' + -- se aperto su faccia sotto + elseif abs( b3Solid:getMax():getZ() - ptP1Comp:getZ()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMax():getZ() - ptP2Comp:getZ()) < 100 * GEO.EPS_SMALL then + return true, 'Top' + -- se aperto su faccia sinistra + elseif abs( b3Solid:getMin():getX() - ptP1Comp:getX()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMin():getX() - ptP2Comp:getX()) < 100 * GEO.EPS_SMALL then + return true, 'Left' + -- se aperto su faccia destra + elseif abs( b3Solid:getMax():getX() - ptP1Comp:getX()) < 100 * GEO.EPS_SMALL and abs( b3Solid:getMax():getX() - ptP2Comp:getX()) < 100 * GEO.EPS_SMALL then + return true, 'Right' + end + -- se non è sul bordo del solido + return false +end + --------------------------------------------------------------------- function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert) -- se lama con asse parallelo alla faccia, passo alla apposita funzione @@ -202,17 +228,30 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw local vtTg = ptP2 - ptP1 ; vtTg:normalize() local dAllStart = 0 local dAllEnd = 0 + local bIsBiLinea = false + local bCosAngleL1L2 = 0 + local dDist1 = dist( ptP1, ptPm) + local dDist2 = dist( ptP2, ptPm) + -- verifico se la bilinea si trova sul bordo del solido, quindi è una geometria aperta + local nIdSolid = EgtGetParent( EgtGetParent( nSurfId)) + -- recupero ingombro del pezzo + local Ls = EgtGetFirstNameInGroup( nIdSolid, 'Box') + local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD) + -- controllo se le linee sono sul bordo della trave, quindi aperte + local bIsL1OnFace = GetNameSolidFaceIncludingLine( b3Solid, ptP1, ptPm) + local bIsL2OnFace = GetNameSolidFaceIncludingLine( b3Solid, ptPm, ptP2) -- se bilinea, scarto la parte più allineata con la direzione ortogonale (se deviazione angolare oltre 20 deg o lunghezza minore di dSawDiam/2 * cos( 20/2)) ma maggiore di un minimo if ( ( ptPm - ptP1) - ( ptPm - ptP1) * vtTg * vtTg):len() > 100 * GEO.EPS_SMALL then + bIsBiLinea = true local vtTg1 = ptPm - ptP1 ; vtTg1:normalize() local vtTg2 = ptP2 - ptPm ; vtTg2:normalize() - local dDist1 = dist( ptP1, ptPm) - local dDist2 = dist( ptP2, ptPm) local dCosMax = 0.951 -- cos( 18°) local dLenMin = 30 local dLenMax = max( 0.5 * dSawDiam * 0.17365 + 1, 2 * dLenMin) --if vtTg1 * vtTg2 < dCosMax or ( dDist1 < dLenMax and dDist1 > dLenMin) or ( dDist2 < dLenMax and dDist2 > dLenMin) then - if vtTg1 * vtTg2 < dCosMax then + + bCosAngleL1L2 = vtTg1 * vtTg2 + if bCosAngleL1L2 < dCosMax then local dOrtho1 = abs( vtTg1 * vtOrthO) local dOrtho2 = abs( vtTg2 * vtOrthO) if dOrtho1 < dOrtho2 or ( abs( dOrtho1 - dOrtho2) < 0.1 and dDist1 > 4 * dDist2) then @@ -267,6 +306,39 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptP1, ptP2, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) local dLenLi2 = abs( dLi2Tang) local dLenLo2 = abs( dLo2Tang) + + -- se il lato non lavorato della bilinea è aperto, setto entrata/uscita con la stessa direzione + if bIsBiLinea then + -- angolo tra le due linee + local dAlpha = acos( abs( bCosAngleL1L2)) + -- se ho accorciato ingresso, setto componente tangente e perpendicolare sul percorso di entrata + if abs( dAllStart) > 100 * GEO.EPS_SMALL and bIsL1OnFace then + -- controllo prima che il secondo lato non sia già incluso nella lavorazione del primo + local dDistPtTang = cos( dAlpha) * dDist1 + local dDistPtPerp = abs( sin( dAlpha) * dDist1) + local dDistToCenter = 0.5 * dSawDiam - dDistPtPerp + local dDistPointToCenter = sqrt( dDistPtTang * dDistPtTang + dDistToCenter * dDistToCenter) + -- se distanza al punto è maggiore del raggio lama, significa che non ho già lavorato, quindi calcolo entrata opportunamente + if dDistPointToCenter > 0.5 * dSawDiam then + dLiTang = -dAllStart * cos( dAlpha) + dLiPerp = sin( dAlpha) * dDist1 + end + end + -- se ho accorciato uscita, setto componente tangente e perpendicolare sul percorso di uscita + if abs( dAllEnd) > 100 * GEO.EPS_SMALL and bIsL2OnFace then + -- controllo prima che il secondo lato non sia già incluso nella lavorazione del primo + local dDistPtTang = cos( dAlpha) * dDist2 + local dDistPtPerp = abs( sin( dAlpha) * dDist2) + local dDistToCenter = 0.5 * dSawDiam - dDistPtPerp + local dDistPointToCenter = sqrt( dDistPtTang * dDistPtTang + dDistToCenter * dDistToCenter) + -- se distanza al punto è maggiore del raggio lama, significa che non ho già lavorato, quindi calcolo uscita opportunamente + if dDistPointToCenter > 0.5 * dSawDiam then + dLoTang = -dAllEnd * cos( dAlpha) + dLoPerp = sin( dAlpha) * dDist2 + end + end + end + -- scelgo l'attacco più conveniente (se non taglio praticamente longitudinale) local bLioTang local Ktp = 1.1