From e42448b6e01a6f2302416ec318626e975cd2ac2a Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 22 Mar 2021 18:04:22 +0000 Subject: [PATCH] DataBeam : - attacchi e uscite di tagli longitudinali da sotto con lama solo ortogonali - modificate lavorazioni LapJoint che sono tagli doppi longitudinali. --- LuaLibs/BeamLib.lua | 8 +-- LuaLibs/ProcessLapJoint.lua | 98 ++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 05fde44..479fe6b 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -1,4 +1,4 @@ --- BeamLib.lua by Egaltech s.r.l. 2021/02/26 +-- BeamLib.lua by Egaltech s.r.l. 2021/03/22 -- Libreria globale per Travi -- 2020/07/28 Corretto calcolo attacchi e uscite di lame per non uscire dalla faccia sotto. -- 2020/08/18 Aggiunto a GetNearestParalOpposite e GetNearestOrthoOpposite parametro opzionale vtNorm. @@ -8,6 +8,7 @@ -- 2021/02/03 In taglio lama si accettano anche due lati con deviazione minore di 20deg. -- 2021/02/09 In taglio lama con PF si preferisce testa in Y- quindi SCC di conseguenza. -- 2021/02/26 In taglio lama consento attacco anche da sotto (grazie a migliorie in MachKernel). +-- 2021/03/22 Attacchi e uscite di tagli longitudinali da sotto con lama solo ortogonali. -- Tabella per definizione modulo local BeamLib = {} @@ -893,8 +894,9 @@ function BeamLib.MakeOneFaceBySaw( nSurfId, nFacet, sCutting, dSawDiam, Par5, dV local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = BeamLib.CalcLeadInOutTangGeom( ptP1act, ptP2act, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) local dLenLi2 = abs( dLi2Tang) local dLenLo2 = abs( dLo2Tang) - -- scelgo l'attacco più conveniente - if ( abs( vtTg:getZ()) < 0.17 and ( vtV1:getZ() < -0.5 or vtV2:getZ() < -0.5)) or ( dLenLi2 < dLenLi and dLenLo2 < dLenLo) or ( dLenLi2 + dLenLo2) < ( dLenLi + dLenLo) then + -- scelgo l'attacco più conveniente (se non taglio praticamente longitudinale) + if abs( vtTg:getX()) < 0.9848 and + ( ( abs( vtTg:getZ()) < 0.17 and ( vtV1:getZ() < -0.5 or vtV2:getZ() < -0.5)) or ( dLenLi2 < dLenLi and dLenLo2 < dLenLo) or ( dLenLi2 + dLenLo2) < ( dLenLi + dLenLo)) then dLiTang, dLiPerp, dLoTang, dLoPerp = dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp end -- posizione braccio diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 4848327..576493a 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -1,4 +1,4 @@ --- ProcessLapJoint.lua by Egaltech s.r.l. 2021/03/20 +-- ProcessLapJoint.lua by Egaltech s.r.l. 2021/03/22 -- Gestione calcolo mezzo-legno per Travi -- 2019/10/08 Agg. gestione OpenPocket. -- 2021/01/24 Con sega a catena ora sempre impostato asse A. @@ -6,6 +6,7 @@ -- 2021/02/04 Razionalizzata gestione forzatura lama. Corretta gestione diametro minimo utensile per svuotatura. -- 2021/03/04 Due facce con testa da sotto. -- 2021/03/20 Piccole correzioni. +-- 2021/03/22 Modificata gestione caso due facce lunghe come la trave con trave corta. -- Tabella per definizione modulo local ProcessLapJoint = {} @@ -3936,54 +3937,61 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) end -- due facce elseif Proc.Fct == 2 then - -- verifico se da lavorare con testa da sotto - local bDownHead = false - if BD.DOWN_HEAD then - local ptC = {} - local vtN = {} - ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) - ptC[2], vtN[2] = EgtSurfTmFacetCenter( Proc.Id, 1, GDB_ID.ROOT) - local vtNm = ( vtN[1] + vtN[2]) ; vtNm:normalize() - bDownHead = vtNm:getZ() < -0.5 + -- recupero l'ingombro della trave + local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) + if not b3Solid then + local sErr = 'Error : part box not found' + EgtOutLog( sErr) + return false, sErr end - -- determino l'angolo tra le facce - local bAdj, _, _, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT) - -- se ortogonali e non forzata lama oppure con testa da sotto, con fresa - if ( not bUseBlade or bDownHead) and bAdj and abs( dAng + 90) < 1 then - -- se piccole - if ( Proc.Box:getDimX() < MAX_MILL_LIN and ( Proc.Box:getDimZ() < MAX_MILL_LIN or Proc.Box:getDimY() < MAX_MILL_LIN)) then - return MakeTwoFacesByMill( Proc, nPhase, nRawId, nPartId, bDownHead) - else - return MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, true) - end - -- altrimenti, con lama + -- se praticamente è lunga come la trave + if Proc.Box:getDimX() > 0.8 * b3Solid:getDimX() then + local nUseSideTool = EgtGetInfo( Proc.Id, Q_SIDE_ROUGH_TOOL, 'i') or 0 + return Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + -- altrimenti else - -- verifico se devo fare prima gli amussi - -- recupero gruppo per geometria addizionale - local nAddGrpId = BL.GetAddGroup( nPartId) - if not nAddGrpId then - local sErr = 'Error : missing AddGroup' - EgtOutLog( sErr) - return false, sErr + -- verifico se da lavorare con testa da sotto + local bDownHead = false + if BD.DOWN_HEAD then + local ptC = {} + local vtN = {} + ptC[1], vtN[1] = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) + ptC[2], vtN[2] = EgtSurfTmFacetCenter( Proc.Id, 1, GDB_ID.ROOT) + local vtNm = ( vtN[1] + vtN[2]) ; vtNm:normalize() + bDownHead = ( vtNm:getZ() < -0.5) end - -- recupero l'ingombro della trave - local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) - if not b3Solid then - local sErr = 'Error : part box not found' - EgtOutLog( sErr) - return false, sErr + -- determino l'angolo tra le facce + local bAdj, _, _, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT) + -- se ortogonali e non forzata lama oppure con testa da sotto, con fresa + if ( not bUseBlade or bDownHead) and bAdj and abs( dAng + 90) < 1 then + -- se piccole + if ( Proc.Box:getDimX() < MAX_MILL_LIN and ( Proc.Box:getDimZ() < MAX_MILL_LIN or Proc.Box:getDimY() < MAX_MILL_LIN)) then + return MakeTwoFacesByMill( Proc, nPhase, nRawId, nPartId, bDownHead) + else + return MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, true) + end + -- altrimenti, con lama + else + -- verifico se devo fare prima gli smussi + -- recupero gruppo per geometria addizionale + local nAddGrpId = BL.GetAddGroup( nPartId) + if not nAddGrpId then + local sErr = 'Error : missing AddGroup' + EgtOutLog( sErr) + return false, sErr + end + -- verifico se due facce o L con una o due facce di terminazione + local bIsL = ( Proc.Fct == 2 or TestElleShape3( Proc) or TestElleShape4( Proc) == 2) + -- verifico se sono presenti i parametri Q per la profondità smusso e + -- per eseguire in esclusiva solo lo smusso + local nChamfer, dDepthCham, sErrCham = EvaluateQParam( Proc) + if (Proc.Fct == 2 and bIsL) and nChamfer > 0 then + local _, _, _, vtOrtho, _, nSurfInt = GetTunnelDimension( Proc, nPartId) + local nOk, sErr = MakeChamfer( Proc, true, nAddGrpId, vtOrtho, b3Solid, nSurfInt, dDepthCham) + if nOk < 0 then return false, sErr end + end + return Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, 'HeadSide' .. EgtIf( bDownHead, '_H2', ''), true, bDownHead) end - -- verifico se due facce o L con una o due facce di terminazione - local bIsL = ( Proc.Fct == 2 or TestElleShape3( Proc) or TestElleShape4( Proc) == 2) - -- verifico se sono presenti i parametri Q per la profondità smusso e - -- per eseguire in esclusiva solo lo smusso - local nChamfer, dDepthCham, sErrCham = EvaluateQParam( Proc) - if (Proc.Fct == 2 and bIsL) and nChamfer > 0 then - local _, _, _, vtOrtho, _, nSurfInt = GetTunnelDimension( Proc, nPartId) - local nOk, sErr = MakeChamfer( Proc, true, nAddGrpId, vtOrtho, b3Solid, nSurfInt, dDepthCham) - if nOk < 0 then return false, sErr end - end - return Fbs.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, 'HeadSide' .. EgtIf( bDownHead, '_H2', ''), true, bDownHead) end -- tre o più facce else